如果我调用realm.create()并传入一个已存在的条目的主键,我的理解是它执行更新而不是插入。
如果我正在使用领域服务器并且一个客户端在现有条目上调用realm.create()并使用与该行中已有的完全相同的数据更新所有字段,那么其他客户端是否需要同步该字段行,或因为没有任何数据改变他们会知道忽略它吗?
是否需要通过对前一个和当前数据进行区分来生成一行同步标记,或者根据上次编辑该条目时的某些元数据,如果数据发生了变化,是否会产生无标记?
我问,因为我有一种情况,一个客户端可能会在数千个现有行上调用realm.create(),即使没有数据会发生变化,我也不希望我的其他客户必须执行巨大的操作结果同步。
答案 0 :(得分:2)
Realm的同步基于实际的数据库操作而不是状态。更具体地,数据库维护事务或操作日志,并且数据同步基于发送该数据。例如,如果执行realm.create('Object', {foo:bar, id: 0}, true)
这是Object
id:0
的upsert操作,则会将其写入日志并进行同步。
结果是即使upsert没有改变任何数据,仍然必须同步该操作。这样做的原因是同步使用操作转换算法来自动确保跨设备的所有更改最终变得一致。这可以通过确保服务器最终接收到每个操作来实现。
因此,如果可能,您应该注意不必要的操作。请注意,同步是高度优化的,与仅同步操作相比,与每次更改时重新发送整个对象相比,数据传输减少了。
从长远来看,我们将在服务器上添加对日志压缩的支持。这意味着客户端仍然总是需要将其操作传输到服务器,但是服务器可以减少聚合其他客户端所需的操作(例如,将多个集合操作折叠到最终集合)。