REALM移动平台同步问题解决方案



我在Realm DB中有类似的链表

ABCD

每个项目都是类似的Realm对象

{名称,下一项}

因此,如果我将设备1上的列表脱机更改为

ACBD-

在设备2上连接

ADBC

然后同步我得到同步数据库,但错误的循环列表

A->D->B->D。。。。。

我该如何解决这个问题?

是否有可能在客户端上同步后获取同步对象,并在启动领域结果通知之前更正列表?

更新。

我也尝试使用这样的模型分层列表

class MList: Object {
dynamic var name = ""
let items = List<MItem>()
}
class MItem: Object {
dynamic var name = ""
let subitems = List<MItem>()
}

我使用了数据

A
B
1.
A
-B
2.
B
-A

同步后但列表丢失了所有项目。所以这样的数据结构不适合我的任务。

好吧,我看到问题了。

不幸的是,手动维护链接列表结构是行不通的,因为Realm将每个链接更新视为常规属性更新,而不知道项目在列表中的位置。因此,当多个参与者更新列表时,无法以预期的方式合并列表更新,结果将是重复、循环或泄漏对象。

相反,我建议您使用Realm的内置列表类型,它将正确合并。您仍然会遇到与数据模型中的parent字段相关的问题,因此,如果两个参与者更改了值,最后一个更改的参与者将"获胜"。我不确定你的确切用例是什么,所以这可能不好,也可能不好。值得注意的是,如果执行树旋转,可能不会很好,在这种情况下,最终会从图中泄漏对象或创建意外的循环。

Realm最好的长期解决方案是引入一个合适的CRDT树类型,但到目前为止还没有需求。如果树是数据模型中的基本需求,我建议在我们的GitHub存储库中为CRDT树创建一个功能请求。

你能使用Realm自己的列表吗?它们有一个非常复杂的合并逻辑,支持元素移动/重新排序:https://realm.io/docs/javascript/latest/#list-属性

现在我有了模型

class MList: Object {
dynamic var name = ""
dynamic var firstItem: PLItem?
}
class MItem: Object {
dynamic var name = ""
dynamic var next: PLItem?
dynamic var parent: PLItem?
}

我使用"next"来创建订单列表和"parent"来创建树结构。

最新更新