Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

同期セッションの管理 - Flutter SDK

項目一覧

  • 前提条件
  • アップロードおよびダウンロードによる変更を待機
  • 同期セッションの一時停止と再開
  • 同期セッションを一時停止するタイミング
  • 同期のアップロードとダウンロードの進行状況の監視
  • ネットワーク接続の監視
  • すべての同期セッションの手動再接続

Atlas Device Sync を使用すると、Flutter SDK は 同期セッション を使用して、バックグラウンドで Atlas とデータを同期します。 同期セッションは、同期された Realm を開くたびに開始されます。

同期セッションは以下を管理します。

  • 同期されたデータベースへの変更のアップロードとダウンロード

  • 同期の一時停止と再開

  • 同期の進行状況のモニタリング

  • ネットワーク接続のモニタリング

セッション にアクセスできます Realm .syncSession 邦土同期された Realm の プロパティ。

同期セッションの状態を管理する前に、次の操作を実行する必要があります。

  1. Atlas App Services バックエンドでの Flexible Sync の構成

  2. Device Sync をアプリに追加する

すべての変更が同期された Realm から Atlas にアップロードされるまで非同期に待機するには、 Session.waitForUpload() を呼び出します 。Atlas のすべての変更が同期された Realm にダウンロードされるまで非同期に待機するには、 Session.waitFor Download() を呼び出します。

// Wait to download all pending changes from Atlas
await realm.syncSession.waitForDownload();
// Add data locally
realm.write(() {
realm.addAll<Car>([
Car(ObjectId(), "Hyundai"),
Car(ObjectId(), "Kia"),
Car(ObjectId(), "Lincoln")
]);
});
// Wait for changes to upload to Atlas before continuing execution.
await realm.syncSession.waitForUpload();

任意の CancelToken waitForUpload()を追加できますwaitForDownload() から および に渡す追加オプション。

final cancellationToken = CancellationToken();
final waitForDownloadFuture =
realm.syncSession.waitForDownload(cancellationToken);
cancellationToken.cancel();
final waitForUploadFuture =
realm.syncSession.waitForUpload(cancellationToken);
cancellationToken.cancel();

セッションの同期を一時停止するには、 Session.一時停止 () を呼び出します 。セッションが一時停止されている間は、Realm は Atlas と変更を同期しません。

変更の同期を再開するには、 Session.resume() を呼び出します。

同期セッションを一時停止して再開するリージョンごとに、 Session.pause()Session.resume()を手動で呼び出す必要があります。 1 つのセッションの同期状態は、開いている他のセッションには影響しません。

次のコード ブロックは、これらのメソッドを呼び出す方法を示しています。

// Pause the sync session
realm.syncSession.pause();
// Data that you add while the sync session is paused does not sync to Atlas.
// However, the data is still added to the realm locally.
realm.write(() {
realm.addAll<Car>([
Car(ObjectId(), "Volvo"),
Car(ObjectId(), "Genesis"),
Car(ObjectId(), "VW")
]);
});
// Resume sync session. Now, the data you wrote to the realm
// syncs to Atlas.
realm.syncSession.resume();

ほとんどのアプリケーションでは、同期セッションを手動で一時停止して再開する必要はありません。 ただし、同期セッションを一時停止または一時停止する必要がある状況もいくつかあります。

  • ユーザーが特定のアクションを実行した後にのみ同期したい場合

  • 特定の時間のみ同期したい場合

  • ネットワーク接続が不十分な場合、同期は試行しないでください

  • 同期セッションを明示的に接続するよう強制したい場合

ネットワーク接続が不十分な場合、ネットワーク接続を確立しようとすると、ユーザーのデバイスのバックアップが枯渇する可能性があります。

同期セッションを明示的に接続するよう 強制する 場合は、一時的にオフラインであることがほとんどです。 同期クライアントは接続を試み、失敗すると指数バックオフになります。 長時間オフラインになると、クライアントがすぐに再接続されないことがあります。 同期セッションを一時停止および再開すると、接続が明示的に強制されます。

同期セッションを一時停止するときは、次の点に注意してください。

  • クライアントがクライアントの最大オフライン時間よりも長時間オフラインになると、クライアントは同期を再開できなくなり、クライアント リセットを実行する必要があります。

  • 同期セッションを一時停止すると、両方の方向で一時停止されます。 アプリがデバイスで行った変更はバックエンド同期されず、バックエンドまたは他のデバイス上のデータに対する変更はデバイスに同期されません。 アップロードのみを一時停止したり、ダウンロードのみを一時停止したりする方法はありません。

  • クライアントがバックエンドとの同期を永続的に停止する場合は、同期セッションを一時停止しないでください。 同期を永続的に停止するには、同期された Realm の内容を同期されていない Realm にコピーし、クライアントで同期されていない Realm を使用します。

無期限の同期を停止するために、同期を一時停止しないでください。 この機能は、これらのユースケース向けに設計またはテストされていません。 この方法で使用すると、さまざまな問題が発生する可能性があります。

バージョン2.0.0での変更: transferredBytestransferrableBytesは非推奨になり、代わりにprogressEstimateが採用されるようになりました

同期の進行状況をモニターするには、 SyncSession.getProgressStream() を呼び出します 。このメソッドは SyncProgress のストリームを返します progressEstimate現在のアップロードまたはダウンロードに対して を提供するオブジェクト。

指定されたprogressEstimateは、 0.0から1.0の値の範囲を持つ double です。 1.0で、進行状況ストリームは完了します。

SyncSession.getProgressStream() は 2 つの引数を取ります。

  • ADirectgression uploadまたはdownload に設定できる列挙型。進行状況ストリームがアップロードの進行状況を監視するか、ダウンロードの進行状況を監視するかを指定します。

  • プログレスモード 次のいずれかに設定できる列挙型。

    • reportIndefinitely: コールバックが登録されていないまで通知を続けるように設定します。

    • forCurrentlyOutstandingWork: progressEstimate1.0に達するまで通知を続けるように設定します。

final stream = realm.syncSession.getProgressStream(
ProgressDirection.upload, ProgressMode.forCurrentlyOutstandingWork);
double progressEstimate = -1;
late StreamSubscription streamListener;
streamListener = stream.listen((syncProgressEvent) {
progressEstimate = syncProgressEvent.progressEstimate;
if (progressEstimate < 1.0) {
print('Upload progress: ${progressEstimate * 100}%');
}
}, onDone: () {
print('Upload progress: ${progressEstimate * 100}%');
print("Upload complete");
}, onError: (error) {
print("An error occurred: $error");
streamListener.cancel();
});

Tip

Realm を初めて開くときに、 onProgress Callbackを使用して同期モニタリングを構成することもできます。

Session . connectionState を使用して現在のネットワーク接続の状態を取得できます 。これにより ConnectionState が返されます ネットワーク接続の状態を含む列挙型connected disconnected、 、またはconnecting

if (realm.syncSession.connectionState == ConnectionState.connected) {
// ... do stuff
}

Session . connectionStateChecks を使用したネットワーク接続の状態の監視 。このプロパティは、 ConnectionStatechange のストリームを返します ネットワーク接続が変更されたときに更新されるオブジェクト。現在と前のConnectionStateにはConnectionStateChangeからアクセスできます。

final connectionStream = realm.syncSession.connectionStateChanges;
late StreamSubscription streamListener;
streamListener = connectionStream.listen((connectionStateChange) {
if (connectionStateChange.current == ConnectionState.connected) {
print("Connected to Atlas Device Sync server");
streamListener.cancel();
}
});

Flutter SDK は、デバイスがオフラインになった後に接続を回復したことを自動的に検出し、増分バックオフ戦略を使用して再接続を試みます。

App.reconnect() メソッドtrigger を使用して再接続試行を手動で することを選択できます。 インクリメンタル バックオフの期間を待つ代わりに、これは、ネットワーク条件をより正確に理解し、自動再接続検出に依存したくない場合に便利です。

app.reconnect();

このメソッドを呼び出すと、SDK はすべての同期セッションに直ちに再接続を試み、増分バックオフに使用されるすべてのタイマーをリセットします。

重要

ソケット読み取りタイムアウト期間内に再接続できません

Flutter SDK の内部デフォルトのソケット読み取りタイムアウトは 2 分であり、読み取り操作が 2 分のウィンドウ内にデータを受信しない場合、SDK はタイムアウトになります。 そのウィンドウ内でApp.Sync.reconnect()を呼び出すと、Flutter SDK は再接続を試行しませ

戻る

同期された Realm へのデータの書込み