0

我正在尝试在 Android 上使用 db-flow 加载一个完整的对象,但它不能正常工作。

文档

出于效率原因,我们建议指定 @ForeignKey(stubbedRelationship = true). 这样做只是将主键引用预设到表对象中。不会设置所有其他字段。如果您需要访问完整的对象,则必须为 Model 调用 load(),或者使用 ModelAdapter 从 DB 中加载对象。

和:

此外,如果您不指定@Database(foreignKeyConstraintsEnforced=true) ,调用 load() 可能没有任何效果。基本上没有@ForeignKey在 SQLite 级别强制执行,您最终可能会得到引用表中不存在的浮动键引用。

应用数据库:

@Database(version = AppDatabase.VERSION, 
        generatedClassSeparator = "_", 
        foreignKeyConstraintsEnforced = true)

object AppDatabase {

    const val NAME = "AppDatabase"
    const val VERSION = 1
}

数据实体:

@Parcelize
@Table(database = AppDatabase::class)
data class Checklist(
        @PrimaryKey(autoincrement = true)
        var id: Long = 0,


        @ForeignKeyReference(foreignKeyColumnName = "idReference", columnName = "category_id")
        @ForeignKey(onUpdate = ForeignKeyAction.CASCADE,
                onDelete = ForeignKeyAction.CASCADE,
                stubbedRelationship = true)
        var module: Module? = null,

}

道功能:

suspend fun save(checklist: Checklist) {
    withContext(ioContext) {
        modelAdapter<Checklist>().save(checklist)
    }
}

检索功能:

suspend fun getChecklist(id: Long): Checklist? = withContext(ioContext) {
        SQLite.select()
                .from(Checklist::class.java)
                .where(Checklist_Table.id.`is`(id))
                .querySingle()
    }

这是问题所在。当我加载 Checklist 对象时,未加载 Checklist 上引用的模块属性。

fun loadChecklist(checklist: Checklist){
    modelAdapter<Checklist>().load(checklist)
    if(checklist.module != null)
        System.out.print("module loded")
    else
        System.out.print("module isn't loaded")
}
4

1 回答 1

0

我使用以下功能解决了问题:

modelAdapter<Module>().load(checklist.module, FlowManager.getWritableDatabase(AppDatabase::class.java))

现在我已经加载了模块。

于 2018-10-23T21:02:14.677 回答