Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

複数のプロセスからのデータの同期

Atlas Device Sync を使用すると、単一の Realm を使用して複数のプロセスのデータを同期できます。

複数のプロセスで同期された Realm を開きたいシナリオの例には、次のようなものがあります。

  • 各ウィンドウが同じ同期された Realm に書き込むマルチウィンドウ デスクトップ アプリケーション。

  • 複数のプロセスから同期された Realm に書込むサーバー アプリケーション。

複数のプロセスから単一の同期された Realm を開くには、次の手順を実行します。

  1. 標準のフレキシブルな同期構成を使用して、Realm を開く単一のメイン プロセスを作成します。 メイン プロセスが同期を取り扱います。

  2. 切断された同期構成を使用して、同じ Realm を開く 1 つ以上のセカンダリ プロセスを作成します。 切断された同期構成を使用すると、セカンダリは同期を処理せずに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');

戻る

同期セッションの管理