バックグラウンドでのデータの同期 - Kotlin SDK
アプリが実行されていないときにデータを同期する必要がある場合は、バックグラウンド プロセスで Realm を同期できます。
前提条件
バックグラウンド同期を開始するには、次の依存関係を Android アプリケーションに追加する必要があります。
mongostats バックグラウンド ワーカーからジョブ結果を返す
例
バックグラウンド同期には、次の 2 つの条件が必要です。
同期ロジック
同期ロジックを定期的に実行するスケジュールされたジョブ
同期ロジック
まず、Realm を同期するカスタム ロジックを記述します。 このロジックをバックエンドへのスタンドアロン接続として扱います。 その結果、次の操作が必要になります。
アプリの Realm 同期構成を取得する
Realm を開くにはユーザーを認証します。 リフレッシュ トークンの有効期限が切れていないログイン ユーザーのキャッシュされた認証情報を使用できます。
Realm を開き、 SyncSession. DownloadAllServerChecks()を使用します およびSyncSession.uploadAllLocalchanges()を使用して、Realm をバックエンドと完全に同期します。 詳細については、「同期セッションの管理 」を参照してください。
邦土を閉じます。
このロジックは、 コルーチンワーカー のサブクラスを使用して、バックグラウンド プロセスとして実行できます。 。同期ロジックをワーカーの doWork()
メソッドに配置します。
package com.mongodb.app.worker import android.annotation.SuppressLint import android.content.Context import androidx.concurrent.futures.ResolvableFuture import androidx.work.CoroutineWorker import androidx.work.WorkerParameters import com.mongodb.app.app import com.mongodb.app.data.RealmSyncRepository import io.realm.kotlin.Realm import io.realm.kotlin.mongodb.syncSession class RealmBackgroundWorker(context: Context, workerParams: WorkerParameters) : CoroutineWorker(context, workerParams) { private lateinit var future: ResolvableFuture<Result> override suspend fun doWork(): Result { future = ResolvableFuture.create() // Get the realm configuration for your app val syncRepository = RealmSyncRepository { session, error -> future.setException(error) } val config = syncRepository.getRealmConfiguration() // Check if user is logged-in if (app.currentUser?.loggedIn == true) { val realm = Realm.open(config) try { realm.syncSession.downloadAllServerChanges() realm.syncSession.uploadAllLocalChanges() } catch (e: InterruptedException) { e.printStackTrace() } finally { realm.close() } return future.get() } companion object { const val UNIQUE_WORK_NAME = "RealmBackgroundWorker" } }
ワーカー
バックグラウンド同期を定期的に実行するワーカーを作成するには、次の手順に従います。
一連の 制約 を作成する ワーカーに必要な条件を指定します。Realm の同期ではデータが使用されるため、デバイスが でない場合は、バックグラウンドでの変更のみをダウンロードすることを検討してください。
低容量
測定データソースの使用
ワーカーが実行する頻度を指定します。 繰り返しの間隔は、Realm 内のデータが更新される頻度と、ユーザーがアプリケーションを開く頻度によって異なります。
Realm が 1 日を通して頻繁に更新される場合は、1 時間から 3 時間の繰り返しの間隔を設定することを検討してください。
Realm が毎日更新する回数が少ない場合は、繰り返しの間隔を低く設定し、バックグラウンド同期は 1 日ごとに 1 回または 2 回にすることをお勧めします。
Android OS でワーカーを使用します。 将来的にそのジョブをアップデートできるように、そのジョブに一意の識別子を割り当てます。
Tip
アプリ内のアプリケーション サブクラス内にバックグラウンド同期ジョブを作成すると、アプリケーションを実行するたびにロジックが 1 回のみ実行されることが保証されます。
// Define any constraints for the background job val constraints: Constraints = Constraints.Builder() .setRequiredNetworkType(NetworkType.UNMETERED) .setRequiresBatteryNotLow(true) .build() // Define the frequency of the background job val backgroundRealmSync = PeriodicWorkRequestBuilder<RealmBackgroundWorker>( // Repeat every 12 hours 12, TimeUnit.HOURS, // Execute job at any point during that 12-hour period 12, TimeUnit.HOURS ) .setConstraints(constraints) .build() // Enqueue the work job, replacing it with the most recent // version if we update it WorkManager.getInstance(this).enqueueUniquePeriodicWork( RealmBackgroundWorker.UNIQUE_WORK_NAME, ExistingPeriodicWorkPolicy.UPDATE, backgroundRealmSync )