未更改的数据如何影响 Realm 同步?

How is a Realm sync effected by unchanged data?

如果我调用 realm.create() 并传入一个已经存在的条目的主键,我的理解是它执行更新而不是插入。

如果我正在使用领域服务器并且一个客户端在现有条目上调用 realm.create() 并使用行中已有的完全相同的数据更新所有字段,其他客户端是否会看到需要同步该行,或者因为 none 的数据已更改,他们会知道忽略它吗?

是否需要同步标志是通过区分以前的数据和当前数据在一行上生成的,或者是根据上次编辑条目的时间在某些元数据上生成的,如果数据发生变化,则无需担心?

我问是因为我遇到这样一种情况,即一个客户可能会在数千个现有行上调用 realm.create(),即使没有数据发生变化,我也不希望我的其他客户必须执行结果是一个巨大的同步。

Realm 的同步是基于实际的数据库操作而不是状态。更具体地说,数据库维护事务或操作日志,数据同步基于传输此数据。例如,如果您执行 realm.create('Object', {foo:bar, id: 0}, true),这是 Objectid:0 的更新插入操作,这将被写入日志并同步。

结果是,即使更新插入不更改任何数据,操作仍必须同步。这样做的原因是同步使用操作转换算法来自动确保跨设备的所有更改最终变得一致。这是通过确保服务器最终接收到每个操作来实现的。

因此,您应该尽可能注意不必要的操作。请注意,同步是高度优化的,与每次更改时重新发送整个对象相比,仅通过同步操作减少了数据传输。

从长远来看,我们将在服务器上添加对日志压缩的支持。这将意味着客户端仍将始终需要将其操作传输到服务器,但服务器可以减少聚合其他客户端所需的操作(例如,将多个集合操作折叠到最后一个集合)。