Загрузить объект с помощью DBFlow - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь загрузить полный объект, используя 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")
}

1 Ответ

0 голосов
/ 24 октября 2018

Я исправляю проблему с помощью функции:

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

Теперь у меня загружен модуль.

...