Я пытаюсь загрузить полный объект, используя db-flow на Android, но он не работает должным образом.
Документация говорит :
Из соображений эффективности мы рекомендуем указать @ForeignKey(stubbedRelationship = true)
.То, что это будет делать, это только предварительно установить ссылки первичного ключа в объект таблицы.Все остальные поля не будут установлены.Если вам нужен доступ к полному объекту, вам придется вызвать load () для Model или использовать ModelAdapter для загрузки объекта из БД.
And:
Также, если вы не укажете @Database(foreignKeyConstraintsEnforced=true)
, вызов load () может не иметь никакого эффекта.По сути, без применения @ForeignKey
на уровне SQLite вы можете получить ссылки с плавающим ключом, которых нет в ссылочной таблице.
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()
}
В этом проблема.Когда я загружаю объект 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")
}