【问题标题】:Android Room: how to query related entities without foreign key columnAndroid Room:如何在没有外键列的情况下查询相关实体
【发布时间】:2019-05-01 15:37:01
【问题描述】:

我的数据的组织方式与您通常在 SQL 数据库中所期望的有所不同,但我无法改变这一点。因此,我有相关实体,其中父级使用一组子 ID 引用其子级:

data class Parent(
    @PrimaryKey val id: Int,
    val children: List<Int>
)

data class Child(
    @PrimaryKey val id: Int
)

我想要的是一个单一的查询或 DAO 函数,它可以在一次调用中检索父级及其子级。所以我可能必须创建一个组合实体,如:

data class ParentWithChildren(
    val parent: Parent,
    val children: List<Child>
)

但是获取结果的推荐方法是什么(最好是 LiveData)?是否有可以检索结果的@Query 注释或者我必须执行以下操作:

@Query("SELECT * FROM parent WHERE id = :id")
fun getParent(id: Int): LiveData<Parent>

@Query("SELECT * FROM child WHERE id IN (:ids)")
fun getChildren(ids: List<Int>): List<Child>

fun getParentWithChildren(id: String): LiveData<ParentWithChildren> {
    return Transformations.map(getParent(id)) { parent ->
        val children = getChildren(parent.children)
        ParentWithChildren(parent, children)
    }
}

或者甚至有不同的方法来解决这个问题?非常感谢有关如何以正确的“类似房间”的方式执行此操作的任何帮助。

【问题讨论】:

标签: android android-room


【解决方案1】:

好吧,现在我已经使用MediatorLiveData 解决了这个问题,因为它似乎是合并 LiveData 的正确工具。因此,我创建了以下(简化的)ViewModel:

class ParentWithChildrenViewModel : ViewModel() {
    val parent: LiveData<Parent>

    val children: LiveData<List<Child>>

    val parentWithChildren = MediatorLiveData<ParentWithChildren>()

    init {
        parent = parentRepository.getParent(id)

        children = Transformations.switchMap(parent) {
            childRepository.getChildren(it.children)
        }

        with (parentWithChildren) {
            addSource(parent) { parent ->
                children.value?.let { children ->
                    value = ParentWithChildren(parent, children)
                }
            }

            addSource(children) { children ->
                parent.value?.let { parent ->
                    value = ParentWithChildren(parent, children)
                }
            }
        }
    }
}

并观察parentWithChildren 属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多