0

我在 Realm DB 中有链表,例如

A B C D

每个项目都是 Realm 对象

{名称,下一项}

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

生物多样性公约

在设备 2 上

中国农业银行

并在之后同步我得到同步的数据库但错误的循环列表

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

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

4

3 回答 3

3

好吧,我看到了问题。

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

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

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

于 2017-02-28T12:59:27.010 回答
0

你可以使用 Realm 自己的列表吗?他们有相当精细的合并逻辑,支持元素移动/重新排序:https ://realm.io/docs/javascript/latest/#list-properties

于 2017-02-15T11:34:03.903 回答
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?
}

我使用“下一个”来排序列表和“父级”来创建树结构。

于 2017-02-17T22:16:14.627 回答