Комната - выборка объекта со списком объектов, который имеет другой список объектов - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть эта настройка комнаты, где мой объект имеет трехуровневую иерархию. Объект верхнего уровня - Parent, у которого есть список Child, а у каждого дочернего элемента есть список SecondLevelChild. Я хочу быть в состоянии получить всю иерархию как один объект LiveData. Структура моей модели выглядит следующим образом:

@Entity(tableName = "parent")
data class Parent(
    @PrimaryKey
    var parentId: String,
    var title: String,
    @Ignore
    var children: MutableList<Child> = ArrayList()
)

И дочерний класс

@Entity(tableName = "child",
    foreignKeys = [ForeignKey(
        entity = Parent::class,
        parentColumns = ["parentId"],
        childColumns = ["parentId"],
        onDelete = CASCADE
    )])
data class Child(
    @PrimaryKey
    var childId: String,
    var parentId: String,
    var title: String,
    @Ignore
    var childrenOfChild: MutableList<SecondLevelChild> = ArrayList()
)

И дочерний класс третьего уровня

@Entity(tableName = "secondLevelChild",
    foreignKeys = [ForeignKey(
        entity = Child::class,
        parentColumns = ["childId"],
        childColumns = ["childId"],
        onDelete = CASCADE
    )])
data class SecondLevelChild(
    @PrimaryKey
    var secondLevelChildId: String,
    var childId: String,
    var title: String,
)

Я могу сохранитьданные в комнату DB с помощью цикла. Однако проблема заключается в получении всего набора данных в виде отдельного объекта типа LiveData.

Я могу получить список дочерних объектов в родительском объекте следующим образом:

fun getParent(parentId: String) {
    var parentLiveData = room.parentDao().getParent(parentId)
    parentLiveData = Transformations.switchMap(parentLiveData) { parent ->
        val childLiveData = room.childDao().getChildrenByParentId(parentId)
        Transformations.map(childLiveData) { children ->
            parent.children.addAll(children)
            elearning
        }
    }
}

Эта логикапрекрасно работает для одноуровневой иерархии. Но как мне перевести эту логику на другой уровень? Как добавить список SecondLevelChildren для каждого элемента в списке детей?

...