更新嵌入式领域对象的参数时,领域对象上的查询不会发出

问题描述 投票:0回答:1

您好,我正在使用 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 参数之外,我该如何克服这个问题?

如有任何帮助,我们将不胜感激!先谢谢你了

android kotlin realm kotlin-multiplatform kotlin-flow
1个回答
0
投票

您遇到的问题是,当您在

.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()
,您可以处理实时数据流,确保您在数据更改时收到更新。

如果您仍然面临同样的问题,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.