Docs 菜单
Docs 主页
/ /
Atlas Device SDKs
/ /

同步多个进程的数据

您可以使用单个 Realm 通过 Atlas Device Sync 来同步来自多个进程的数据。

您可能希望在多个进程中打开同步 Realm 的场景示例包括:

  • 多窗口桌面应用程序,其中每个窗口都写入相同的同步 Realm。

  • 从多个进程写入同步 Realm 的服务器应用程序。

要从多个进程打开单个同步域,请执行以下操作:

  1. 创建一个使用标准 Flexible Sync 配置打开 Realm 的单个主进程。 主进程处理同步。

  2. 创建一个或多个从节点进程,使用断开连接的同步配置打开同一域。使用断开连接的同步配置,从节点进程可以读取 Realm 数据并将其写入 Realm,而无需处理同步。 主进程负责从节点进程的所有数据的同步。

要在主进程中打开同步域 ,请使用 Configuration.FlexibleSync() 构造函数。有关更多信息,请参阅 打开同步Realm。

main_process.dart
// Same realm file location as secondary process
final realmPath =
path.join(Configuration.defaultStoragePath, 'synced.realm');
final flexibleConfig =
Configuration.flexibleSync(currentUser, schema, path: realmPath);
final realmWithSync = Realm(flexibleConfig);

要在从节点进程中打开同步 Realm,请使用Configuration Configuration.disconnectedSync() 创建构造函数。 包括模式和任何其他可选的命名参数。

secondary_process.dart
// Same realm file location as primary process
final sameRealmPath =
path.join(Configuration.defaultStoragePath, 'synced.realm');
final disconnectedSyncConfig =
Configuration.disconnectedSync(schema, path: sameRealmPath);
final realmWithDisconnectedSync = Realm(disconnectedSyncConfig);

在多个进程之间共享同一个 Realm 文件时,Realm 内置了自动刷新功能。从一个进程写入的数据对其他进程可见。 通常,无需编写额外的逻辑来跨进程刷新数据。

但是,有时刷新可能不会立即发生。 在这种情况下,您可以使用trigger Realm.refresh() 在进程中 手动刷新 或 Realm.refreshAsync()。

要同步强制更新通知其他进程所做的更改,请调用Realm.refresh()

main_process.dart
// Add object in one process
realm.write(() {
realm.add(Person('John'));
});
secondary_process.dart
// Call realm.refresh() in the secondary process
// to trigger the data written in the main process
// to register in the secondary process.
realm.refresh();
final john = realm.find<Person>('John');

或者,您可以使用Realm.refreshAsync()异步强制更新其他进程所做更改的通知。

secondary_process.dart
// Asynchronously refresh the realm in the background.
await realm.refreshAsync();
final john = realm.find<Person>('John');

后退

管理同步会话