このページでは、同期セッションと、Flexible Sync を使用してアプリ内で同期セッションを管理する方法について説明します。 Flexible Sync の詳細については、App Services ドキュメントの「 Atlas Device Sync 」を参照してください。
同期セッション
Flexible Sync を使用すると、Realm Kotlin SDK は同期セッションを使用して、バックグラウンドで Atlas とデータを同期します。 同期セッションは、同期された Realm を開くたびに開始されます。
val app = App.create(YOUR_APP_ID) val user = app.login(credentials) val config = SyncConfiguration.Builder(user, setOf(Task::class)) .build() // Open the synced realm val realm = Realm.open(config) // Sync session is now active // ... do something with the synced realm
同期セッションは以下を管理します。
Realm への変更のアップロードとダウンロード
同期の一時停止と再開
ネットワーク接続のモニタリング
1 つの同期された Realm のSyncSessionには、 Realm.syncSessionプロパティを使用してアクセスできます。
接続状態とセッション状態
Kotlin SDK は、App Services との通信を 2 つのレベルで管理します。
接続状態: クライアント デバイスとバックエンド アプリ間のネットワーク接続の状態を指します。
セッション状態: 単一ユーザーの同期状態で、SDK 内で任意に一時停止および再開できます( 「 同期セッションの一時停止と再開 」セクションを参照)。
どちらの状態にも、ユーザーのローカル変更がバックエンドに同期されるかどうかが決まります。 同期は、 SyncSession.ConnectionStateが CONNECTEDで、かつ SyncSession.StateがACTIVEまたはDYINGの場合にのみ発生します。
アップロードおよびダウンロードによる変更を待機
すべての変更が同期された Realm から Atlas にアップロードされるのを非同期に待機するには、 updateAllLocalchangesを呼び出します。 このメソッドは、すべての変更がアップロードされたときにtrueを返します。
Atlas のすべての変更が Device Sync サーバーから同期された Realm にダウンロードされるまで非同期に待機するには、 DownloadAllServerChecks を呼び出します。 このメソッドは、すべての変更がダウンロードされたときにtrueを返します。
また、どちらのメソッドにも任意のtimeoutパラメータを含めて、 falseを返すまでの最大時間を決定できます。 falseが返された後もアップロードまたはダウンロードはバックグラウンドで続行されることに注意してください。
次の例では、タイムアウトが定義された両方のメソッドを呼び出す方法が示されています。
// Wait to download all pending changes from Atlas realm.syncSession.downloadAllServerChanges(1.minutes) // Add data locally realm.write { this.copyToRealm(Task().apply { taskName = "Review proposal" assignee = "Emma" progressMinutes = 0 }) } // Wait for local changes to be uploaded to Atlas realm.syncSession.uploadAllLocalChanges(1.minutes)
同期セッションの一時停止と再開
セッションの同期を一時停止するには、 syncSession.一時停止()を呼び出します。 セッションが一時停止されている間は、Realm は Atlas と変更を同期しません。
変更の同期を再開するには、 syncSession.resume() を呼び出します。
同期セッションを一時停止して再開するリージョンごとに、 syncSession.pause()とsyncSession.resume()を手動で呼び出す必要があります。 1 つのセッションの同期状態は、開いている他のセッションには影響しません。
次のコード ブロックは、これらのメソッドを呼び出す方法を示しています。
// Pause the sync session // Data that you write while session is paused does not sync to Atlas realm.syncSession.pause() // Add data locally realm.write { this.copyToRealm(Task().apply { taskName = "Submit expense report" assignee = "Kevin" progressMinutes = 0 }) } // Resume sync session // Local changes now sync to Atlas realm.syncSession.resume()
同期セッションを一時停止するタイミング
ほとんどのアプリケーションでは、同期セッションを手動で一時停止して再開する必要はありません。 ただし、同期セッションを一時停止または一時停止する必要がある状況もいくつかあります。
ユーザーが特定のアクションを実行した後にのみ同期したい場合
特定の時間のみ同期したい場合
ネットワーク接続が不十分な場合、同期は試行しないでください
同期セッションを明示的に接続するよう強制したい場合
ネットワーク接続が不十分な場合、ネットワーク接続を確立しようとすると、ユーザーのデバイスのバックアップが枯渇する可能性があります。
同期セッションを明示的に接続するよう 強制する 場合は、一時的にオフラインであることがほとんどです。 同期クライアントは接続を試み、失敗すると指数バックオフになります。 長時間オフラインになると、クライアントがすぐに再接続されないことがあります。 同期セッションを一時停止および再開すると、接続が明示的に強制されます。
同期セッションを一時停止するときは、次の点に注意してください。
クライアントがクライアントの最大オフライン時間よりも長時間オフラインになると、クライアントは同期を再開できなくなり、クライアント リセットを実行する必要があります。
同期セッションを一時停止すると、両方の方向で一時停止されます。 アプリがデバイスで行った変更はバックエンドと同期されず、バックエンドまたは他のデバイス上のデータに対する変更はデバイスに同期されません。 アップロードのみを一時停止したり、ダウンロードのみを一時停止したりする方法はありません。
クライアントがバックエンドとの同期を永続的に停止する場合は、同期セッションを一時停止しないでください。 同期を永続的に停止するには、同期された Realm の内容を同期されていない Realm にコピーし、クライアントで同期されていない Realm を使用します。
無期限の同期を停止するために、同期を一時停止しないでください。 この機能は、これらのユースケース向けに設計またはテストされていません。 この方法で使用すると、さまざまな問題が発生する可能性があります。
ネットワーク接続の監視
現在のネットワーク接続の状態を取得するには、 SyncSession. connectionState を確認します。 プロパティ。 これにより、ネットワーク接続の状態を示すConnectionState列挙値が返されます。 可能な状態はCONNECTED 、 DISCONNECTED 、またはCONNECTINGです。
if (realm.syncSession.connectionState == ConnectionState.CONNECTED) { Log.i("Connected to network") // ... do something }
connectionStateAsFlow を使用してネットワーク接続の状態を監視します。 このプロパティは、ネットワーク接続が変更されたときに更新されるConnectionStateManyオブジェクトのフローを返します。 ConnectionStateChangeから新しいConnectionStateにアクセスできます。
val connectionFlow = realm.syncSession.connectionStateAsFlow() connectionFlow.collect { ConnectionStateChange -> if (ConnectionStateChange.newState == ConnectionState.CONNECTED) { Log.i("Connected to Atlas Device Sync server") } }
すべての同期セッションの手動再接続
バージョン 1.11.0 の新機能。
Realm は、デバイスがオフラインの後に接続を回復し、増分バックオフ戦略を使用して再接続を試みることを自動的に検出します。
Kotlin SDK1.11.0バージョン 以降では、trigger App.Sync.reconnect() メソッド を使用して再接続試行を手動で することができます。インクリメンタル バックオフの期間を待つ代わりに、 これは、ネットワーク条件をより正確に理解し(たとえば、Android でConnectivityManagerを使用してネットワークの変更を監視する場合など)、Realm の自動再接続検出に依存したくない場合に便利です。 SDK は、デバイスがプレーンモードを切り替えるときにもこのメソッドを自動的に呼び出します。
再接続試行を手動でtriggerするには、 App.Sync.reconnect() App.Syncインターフェースを通じてアクセスされます。 単一の Realm 同期セッションにアクセスできるSyncSessionとは異なり、 App.Syncインターフェースはアプリのすべての同期セッションを制御します。
app.sync.reconnect()
このメソッドを呼び出すと、SDK はすべての同期セッションに直ちに再接続を試み、増分バックオフに使用されるすべてのタイマーをリセットします。
重要
ソケット読み取りタイムアウト期間内に再接続できません
Realmの内部デフォルトのソケット読み取りタイムアウトは 2 分であり、読み取り操作が 2 分以内にデータを受信しない場合はRealmになります。 そのウィンドウ内でApp.Sync.reconnect()を呼び出すと、 Kotlin SDK は再接続を試行しません。