我在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
同步后但是列表丢失了所有项目。所以这样的数据结构不适合我的任务。
答案 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”来创建树结构。