gpt4 book ai didi

安卓房间 : how to query related entities without foreign key column

转载 作者:行者123 更新时间:2023-12-05 00:06:03 26 4
gpt4 key购买 nike

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

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

最佳答案

好吧,现在我已经使用 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 属性。

关于安卓房间 : how to query related entities without foreign key column,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55853372/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com