Android Room: 如何在没有外键列的情况下查询相关实体

3

我的数据组织方式与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)
    }
}

还有其他的方法吗?非常感谢对如何以正确的“Room”方式完成此操作的任何帮助。


使用@Relation,您可以在此处引用 - https://developer.android.com/reference/android/arch/persistence/room/Relation - Gautam
我不这么认为。如果我正确理解@Relation,它只有在Child有对其Parent的引用时才起作用,这正是我的问题所在:只有父级拥有对其子级的引用。 - Rogier
1个回答

0

目前,我已经使用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属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接