我正在尝试在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")
}
答案 0 :(得分:0)
我使用以下功能解决了该问题:
modelAdapter<Module>().load(checklist.module, FlowManager.getWritableDatabase(AppDatabase::class.java))
现在我已经加载了模块。