我正在尝试在 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")
}