REALM MOBILE PLATFORM同步问题解决

时间:2017-02-14 12:09:44

标签: swift3 realm realm-mobile-platform

我在Realm DB中有链接列表,如

ABCD

每个项目都是Realm对象,如

{name,next item}

因此,如果我将设备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

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

3 个答案:

答案 0 :(得分:3)

好的,我看到了问题。

遗憾的是,手动维护链接列表结构不起作用,因为Realm将每个链接更新视为常规属性更新,而不了解项目在列表中的位置。因此,当多个参与者更新列表时,列表更新不能以预期的方式合并,结果将是重复,循环或泄漏的对象。

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

最好的长期解决方案是Realm引入适当的CRDT树类型,但到目前为止还没有这方面的需求。如果树是数据模型中的基本要求,我建议在our GitHub repository中为CRDT树创建功能请求。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

现在我有了模型

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”来创建树结构。