同期された Realm の構成 - Java SDK
前提条件
クライアントから同期された Realm にアクセスする前に、次の操作を行う必要があります。
同期された Realm
同期された Realm はAtlas Device Syncを使用して、クライアントデバイスと同期されたデータソースの両方にデータを保存します。 同期された Realm の起動は、同期された Realm の設定をカスタマイズするためにSyncConfiguration
を使用することを除いて、ローカル Realm を開くのとまったく同じように機能します。
同期された Realm の構成
Realm の設定を構成するには、 SyncConfiguration.Builder を使用してSyncConfigurationを作成します。
同期された Realm を開くには、 SyncConfiguration オブジェクトを渡して getInstanceAsync() を呼び出します。
アプリケーションで Flexible Sync を使用する場合は、 SyncConfiguration.InitialFlexibleSyncSubscriptions() のインスタンスを使用して initialSubscriptions() 同期構成ビルダのメソッドを呼び出して、同期された Realm を開きます。configure()
メソッドでは、 Subscription.create()を使用して、名前とクエリを使用してUnmanagedSubscription
をインスタンス化します。 新しいサブスクリプションをMutableSubscriptionSetパラメータのadd()
メソッドに渡して、サブスクライブに追加します。
// instantiate a Realm App connection String appID = YOUR_APP_ID; // replace this with your App ID App app = new App(new AppConfiguration.Builder(appID) .build()); // authenticate a user Credentials credentials = Credentials.anonymous(); app.loginAsync(credentials, it -> { if (it.isSuccess()) { User user = it.get(); // add an initial subscription to the sync configuration SyncConfiguration config = new SyncConfiguration.Builder(app.currentUser()) .initialSubscriptions(new SyncConfiguration.InitialFlexibleSyncSubscriptions() { public void configure(Realm realm, MutableSubscriptionSet subscriptions) { subscriptions.add(Subscription.create("subscriptionName", realm.where(Frog.class) .equalTo("species", "spring peeper"))); } }) .build(); // instantiate a realm instance with the flexible sync configuration Realm.getInstanceAsync(config, new Realm.Callback() { public void onSuccess(Realm realm) { Log.v("EXAMPLE", "Successfully opened a realm."); } }); } else { Log.e("EXAMPLE", "Failed to log in: " + it.getError().getErrorMessage()); } });
// instantiate a Realm App connection val appID: String = YOUR_APP_ID // replace this with your App ID val app = App( AppConfiguration.Builder(appID) .build() ) // authenticate a user val credentials = Credentials.anonymous() app.loginAsync( credentials ) { it: App.Result<User?> -> if (it.isSuccess) { val user = it.get() // add an initial subscription to the sync configuration val config = SyncConfiguration.Builder(app.currentUser()) .initialSubscriptions { realm, subscriptions -> subscriptions.add( Subscription.create( "subscriptionName", realm.where(Frog::class.java) .equalTo("species", "spring peeper") ) ) } .build() // instantiate a realm instance with the flexible sync configuration Realm.getInstanceAsync(config, object : Realm.Callback() { override fun onSuccess(realm: Realm) { Log.v("EXAMPLE", "Successfully opened a realm.") } }) } else { Log.e( "EXAMPLE", "Failed to log in: " + it.error.errorMessage ) } }
重要
UI スレッドでの同期読み取りと書込み
デフォルトでは、非同期トランザクションを使用して、アプリケーションの UI スレッド内の Realm の読み取りまたは書き込みのみが可能です。 つまり、同期メソッドの使用を明示的に許可しない限り、Android アプリケーションのメイン スレッドでは、名前がAsync
という単語で終わるRealm
メソッドのみを使用できます。
この制限はアプリケーション ユーザーのメリットのために存在します。UI スレッドで読み取りおよび書込み操作を実行すると、UI のインタラクションが応答しなくなったり低速になったりする可能性があるため、通常、これらの操作は非同期またはバックグラウンド スレッドで取り扱うことをお勧めします。 ただし、アプリケーションで同期 Realm の読み取りまたは UI スレッドでの書込みを使用する必要がある場合は、次のSyncConfiguration
オプションを使用して同期メソッドの使用を明示的に許可できます。
SyncConfiguration config = new SyncConfiguration.Builder(app.currentUser()) .allowQueriesOnUiThread(true) .allowWritesOnUiThread(true) .initialSubscriptions(new SyncConfiguration.InitialFlexibleSyncSubscriptions() { public void configure(Realm realm, MutableSubscriptionSet subscriptions) { subscriptions.add(Subscription.create("springPeepers", realm.where(Frog.class) .equalTo("species", "spring peeper"))); } }) .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()) .allowQueriesOnUiThread(true) .allowWritesOnUiThread(true) .initialSubscriptions { realm, subscriptions -> subscriptions.add( Subscription.create( "subscriptionName", realm.where(Frog::class.java) .equalTo("species", "springPeepers") ) ) } .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 を開くのに使用するのとまったく同じ構文で、オフラインのときに同期された Realm を開くことができます。 すべての SDK がこのパターンに従うわけではないため、クロスプラットフォーム開発者は各 SDK のドキュメントを参照して詳細を確認する必要があります。
Realm を閉じる
Realm インスタンスでリソースを解放する場合は、 close()メソッドを呼び出すことが重要です。 を無視して Realm を閉じると、 OutOfMemoryError
が発生する可能性があります。
realm.close();
realm.close()