使用DBFlow加载对象

时间:2018-10-23 13:33:31

标签: android kotlin dbflow

我正在尝试在Android上使用db-flow加载完整的对象,但无法正常工作。

文档says

  

出于效率考虑,我们建议您指定   @ForeignKey(stubbedRelationship = true)。这只会做什么   将主键引用预置到表对象中。所有其他   字段将不会设置。如果您需要访问完整对象,则可以   将必须为Model调用load()或使用ModelAdapter加载   数据库中的对象。

并且:

  

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

AppDatabase:

@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,

}

dao函数:

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()
    }

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

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")
}

1 个答案:

答案 0 :(得分:0)

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

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

现在我已经加载了模块。