パーティションベースの同期 - Java SDK
項目一覧
パーティションベースの同期は、Realm Java SDK で Atlas Device Sync を使用するための古いモードです。 新しいアプリにはFlexible Syncを使用することをお勧めします。 このページの情報は、パーティションベースの同期を引き続き使用しているユーザー向けです。
Tip
Realm Java SDK v 10.16.0以降では、パーティションベースの同期から Flexible Sync に移行する機能がサポートされています。 詳細については、「 パーティションベースの同期から Flexible Sync への移行 」を参照してください。
パーティションベースの同期 と Atlas App Services でのパーティションベースの同期の構成方法について詳しくは、Atlas App Services ドキュメントの「パーティションベースの同期 」を参照してください。
パーティション値
バックエンド アプリ構成にパーティションベースの同期を選択する場合、クライアント実装にはパーティション値を含める必要があります。 これは、 Flexible Sync を設定するときに選択したパーティションキーフィールドの値です。
パーティション値によって、クライアント アプリケーションがアクセスできるデータが決まります。
同期された Realm を開くときに、パーティション値を渡します。
同期された Realm を開く
Realm の設定を構成するには、 SyncConfiguration.Builder を使用してSyncConfigurationを作成します。
次の例では、次の要素を使用して同期された Realm を構成します。
パーティションベースの同期
UI スレッドで明示的に許可された同期読み取り
UI スレッドで明示的に許可された同期書込み (write)
オープン Realm を返す前に、すべてのバックエンドの変更がデバイスに同期するのを明示的に待機する
ファイル領域を節約するためにRealmを起動するときに 自動圧縮 します
警告
実稼働アプリケーションはクライアントのリセットを処理する必要があります
実稼働環境で使用されるアプリケーションは、クライアント リセット エラーを処理する必要があります。 To learn more, see Reset a Client Realm.
SyncConfiguration config = new SyncConfiguration.Builder(app.currentUser(), PARTITION) .allowQueriesOnUiThread(true) .allowWritesOnUiThread(true) .waitForInitialRemoteData(500, TimeUnit.MILLISECONDS) .compactOnLaunch() .build(); Realm.getInstanceAsync(config, new Realm.Callback() { public void onSuccess(Realm realm) { Log.v("EXAMPLE", "Successfully opened a realm."); } });
val config = SyncConfiguration.Builder(app.currentUser(), PARTITION) .allowQueriesOnUiThread(true) .allowWritesOnUiThread(true) .waitForInitialRemoteData(500, TimeUnit.MILLISECONDS) .compactOnLaunch() .build() Realm.getInstanceAsync(config, object : Realm.Callback() { override fun onSuccess(realm: Realm) { Log.v("EXAMPLE", "Successfully opened a realm.") } })
重要
UI スレッドでの同期読み取りと書込み
デフォルトでは、非同期トランザクションを使用して、アプリケーションの UI スレッド内の Realm の読み取りまたは書き込みのみが可能です。 つまり、同期メソッドの使用を明示的に許可しない限り、Android アプリケーションのメイン スレッドで名前がAsync
で終わる Realm
メソッドのみを使用できます。
この制限はアプリケーション ユーザーのメリットのために存在します。UI スレッドで読み取りおよび書込み操作を実行すると、UI のインタラクションが応答しなくなったり低速になったりする可能性があるため、通常、これらの操作は非同期またはバックグラウンド スレッドで取り扱うことをお勧めします。 ただし、アプリケーションで同期 Realm の読み取りまたは UI スレッドでの書込みを使用する必要がある場合は、次のSyncConfiguration
オプションを使用して同期メソッドの使用を明示的に許可できます。
SyncConfiguration config = new SyncConfiguration.Builder(app.currentUser(), PARTITION) .allowQueriesOnUiThread(true) .allowWritesOnUiThread(true) .build(); Realm.getInstanceAsync(config, new Realm.Callback() { public void onSuccess(Realm realm) { Log.v( "EXAMPLE", "Successfully opened a realm with reads and writes allowed on the UI thread." ); } });
val config = SyncConfiguration.Builder(app.currentUser(), PARTITION) .allowQueriesOnUiThread(true) .allowWritesOnUiThread(true) .build() Realm.getInstanceAsync(config, object : Realm.Callback() { override fun onSuccess(realm: Realm) { Log.v("EXAMPLE", "Successfully opened a realm with reads and writes allowed on the UI thread.") } })
オンライン中に同期された Realm を開く
同期された Realm を開くには、 SyncConfiguration オブジェクトを渡して getInstanceAsync() を呼び出します。次のコードは、 SyncConfiguration
オブジェクトを使用して作成された特定の同期設定で Realm を作成する方法を示しています。
SyncConfiguration config = new SyncConfiguration.Builder(app.currentUser(), PARTITION) .allowQueriesOnUiThread(true) .allowWritesOnUiThread(true) .build(); Realm.getInstanceAsync(config, new Realm.Callback() { public void onSuccess(Realm realm) { Log.v( "EXAMPLE", "Successfully opened a realm with reads and writes allowed on the UI thread." ); } });
val config = SyncConfiguration.Builder(app.currentUser(), PARTITION) .allowQueriesOnUiThread(true) .allowWritesOnUiThread(true) .build() Realm.getInstanceAsync(config, object : Realm.Callback() { override fun onSuccess(realm: Realm) { Log.v("EXAMPLE", "Successfully opened a realm with reads and writes allowed on the UI thread.") } })
上記のコードは、 getInstanceAsync() を使用して、Realm を 非同期 に開く方法を示しています。また、 getInstance()を使用して、Realm を同期的に開くこともできます。これは、バックエンドからのすべてのデータを同期する前に開いている Realm を返します。 ただし、リモート データがダウンロードされている中に一時的なデータの不整合が発生する可能性があるため、通常は推奨されません。 waitForInitialMongoDB()構成オプションを使用すると、Realm を開く前に SDK にリモート データを取得させるよう強制して、こうした不整合を回避できます。
パーティション値は、同期するデータのどのサブセットを指定します。 これは通常、ユーザー ID、プロジェクト ID、ストア ID、または現在のユーザーに特定の関連性を持つアプリ内のその他のカテゴリ識別子です。
オフライン時に同期された Realm を開く
オンライン 中に同期された Realm を開くのに使用するのとまったく同じ構文で、オフラインのときに同期された Realm を開くことができます。 すべての SDK がこのパターンに従うわけではないため、クロスプラットフォーム開発者は各 SDK のドキュメントを参照して詳細を確認する必要があります。
パーティションベースの同期から Flexible Sync への移行
App Services Device Sync モードを、パーティションベースの同期から Flexible Sync に移行できます。 移行は自動プロセスであり、アプリケーション コードを変更する必要はありません。 自動移行には、Realm Java SDK バージョン 10.16.0 以降が必要です。
移行により、既存の App Services ユーザーと認証構成を維持できます。 Flexible Sync は、より多目的の権限構成オプションとよりきめの細かいデータ同期を提供します。
App Services App をパーティションベースの同期から Flexible Sync に移行する方法の詳細については、「 Device Sync モードの移行 」を参照してください。
移行後のクライアント コードの更新
パーティションベースの同期から Flexible Sync への自動移行には、クライアント コードを変更する必要はありません。 ただし、この機能をサポートするために、Realm は 2 つの同期モード間の違いを次の方法で自動的に処理します。
partitionKey == partitionValue
の各オブジェクトタイプの Flexible Sync サブスクリプションを自動的に作成します。すべてのオブジェクトに
partitionKey
フィールドを挿入します(フィールドがまだ存在しない場合)。 これは自動 Flexible Sync サブスクライブに必要です。
If you need to make updates to your client code after migration, consider updating your client codebase to remove hidden migration functionality. 次の場合には、クライアント コードベースを更新する必要がある場合があります。
クライアント コードベースで新しいモデルを追加または変更する
Realm オブジェクトの読み取りまたは書き込みを含む機能を追加または変更する場合
同期するデータの内容をより詳細に制御する機能を実装したい
Flexible Sync を使用するようにパーティションベースの同期クライアント コードを変換するには、次の変更を行います。
を使用するように SyncConfiguration.Builder Flexible Syncを更新します。これには、必要に応じて、
partitionValue
を削除し、一連の初期サブスクリプションを追加することが含まれます。Flexible Sync サブスクライブで使用する関連プロパティをオブジェクトモデルに追加します。 たとえば、ユーザーが自分のデータのみを同期できるようにするには、
ownerId
プロパティを追加します。自動 Flexible Sync サブスクライブを削除します。
SyncConfiguration.Builder
で初期サブスクリプションを追加しなかった場合は、関連するサブスクライブを手動で作成します。
これらの戦略にデータをモデル化する方法の例を含む、Flexible Sync 権限戦略の例については、 Device Sync 権限ガイド を参照してください。
サブスクリプションの削除と手動作成
パーティションベースの同期から Flexible Sync に移行すると、Realm はアプリ用の非表示の Flexible Sync サブスクリプションを自動的に作成します。 次回サブスクリプションを追加または変更するときは、次の操作を行うことをお勧めします。
これにより、将来の反復やデバッグのために、すべてのサブスクライブ ロジックをコードベースにまとめて表示できます。
自動生成される Flexible Sync サブスクライブの詳細については、「クライアント アプリの Flexible Sync への移行 」を参照してください。