Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

バックグラウンドでのデータの同期 - Kotlin SDK

項目一覧

  • 前提条件
  • 同期ロジック
  • ワーカー

アプリが実行されていないときにデータを同期する必要がある場合は、バックグラウンド プロセスで Realm を同期できます。

バックグラウンド同期を開始するには、次の依存関係を Android アプリケーションに追加する必要があります。

  • mongos.work:work-runtime ジョブを確保します

  • mongostats バックグラウンド ワーカーからジョブ結果を返す

バックグラウンド同期には、次の 2 つの条件が必要です。

  • 同期ロジック

  • 同期ロジックを定期的に実行するスケジュールされたジョブ

まず、Realm を同期するカスタム ロジックを記述します。 このロジックをバックエンドへのスタンドアロン接続として扱います。 その結果、次の操作が必要になります。

  1. アプリの Realm 同期構成を取得する

  2. Realm を開くにはユーザーを認証します。 リフレッシュ トークンの有効期限が切れていないログイン ユーザーのキャッシュされた認証情報を使用できます。

  3. Realm を開き、 SyncSession. DownloadAllServerChecks()を使用します およびSyncSession.uploadAllLocalchanges()を使用して、Realm をバックエンドと完全に同期します。 詳細については、「同期セッションの管理 」を参照してください。

  4. 邦土を閉じます。

このロジックは、 コルーチンワーカー のサブクラスを使用して、バックグラウンド プロセスとして実行できます。 。同期ロジックをワーカーの doWork()メソッドに配置します。

RealmBackgroundServer.kt の例
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>
@SuppressLint("RestrictedApi")
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"
}
}

バックグラウンド同期を定期的に実行するワーカーを作成するには、次の手順に従います。

  1. 一連の 制約 を作成する ワーカーに必要な条件を指定します。Realm の同期ではデータが使用されるため、デバイスが でない場合は、バックグラウンドでの変更のみをダウンロードすることを検討してください。

    • 低容量

    • 測定データソースの使用

  2. ワーカーが実行する頻度を指定します。 繰り返しの間隔は、Realm 内のデータが更新される頻度と、ユーザーがアプリケーションを開く頻度によって異なります。

    • Realm が 1 日を通して頻繁に更新される場合は、1 時間から 3 時間の繰り返しの間隔を設定することを検討してください。

    • Realm が毎日更新する回数が少ない場合は、繰り返しの間隔を低く設定し、バックグラウンド同期は 1 日ごとに 1 回または 2 回にすることをお勧めします。

  3. 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
)

戻る

Atlas へのデータのストリーム