您好,我正在使用 Kotlin Realm 作为我的 Kotlin 多平台项目的数据库。
我有以下两个对象的结构:
class MyRealmObject: RealmObject {
@PrimaryKey
var id: String = ""
var myEmbeddedRealmObjects: RealmList<MyEmbeddedRealmObject> = realmListOf()
}
class MyEmbeddedRealmObject: EmbeddedRealmObject {
var exampleEmbeddedParam: String = ""
}
此外,我的数据库中有一个查询,如下所示:
fun observeMyRealmObject(id: String): Flow<MyRealmObject?> = realm
.query<MyRealmObject>("id = $0", id)
.first()
.asFlow()
.mapLatest { myRealmObject: MyRealmObject -> myRealmObject.obj }
当我现在更新任何
exampleEmbeddedParam
的 MyEmbeddedRealmObject
参数时,我的流程不会发出新的状态更新。
我了解到,.asFlow()
函数的嵌套层次结构默认为4,我可以使用
keyPaths
函数的.asFlow()
参数来克服这一限制。
但是,从我的角度来看,
myEmbeddedRealmObjects
位于层次结构级别 1,因此当任何 MyEmbeddedRealmObject
的 exampleEmbeddedParam
(级别 2)更新时,应该通知查询。
然而,情况并非如此,只有当我添加显式
keyPaths
参数(如 .asFlow(listOf("myEmbeddedRealmObjects.*")
或 .asFlow(listOf("*.*")
)时,我的查询才会发出更新。
默认情况下,realmList 参数或任何其他第二级 EmbeddedRealmObject 更改都会被忽略,除非我明确使用
keyPaths
函数的 .asFlow()
参数?除了对所有需要从嵌入式领域对象参数获取更新的查询使用显式 keyPath 参数之外,我该如何克服这个问题?
如有任何帮助,我们将不胜感激!先谢谢你了
您遇到的问题是,当您在
.first()
之后调用 query<>()
时,它会返回冻结的 Realm 对象,这意味着您没有收到任何更新。要解决此问题,您应该在查询后调用 .asFlow()
来获取实时的最新数据流,然后根据您的需要进行映射。以下是修改代码的方法:
fun observeMyRealmObject(id: String): Flow<MyRealmObject?> = realm
.query<MyRealmObject>("id = $0", id)
.asFlow() // Convert the result to a flow of live data
.mapLatest { result ->
result.list.firstOrNull() // Get the first item from the list
}
通过在
.asFlow()
之前调用 .first()
,您可以处理实时数据流,确保您在数据更改时收到更新。
如果您仍然面临同样的问题,请告诉我。