Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

同期された Realm の構成 - Java SDK

項目一覧

  • 前提条件
  • 同期された Realm
  • 同期された Realm の構成
  • オフライン時に同期された Realm を開く
  • Realm を閉じる

注意

新しい Java SDK アプリでは RealmAny を使用できません

新しい App Services アプリは、 RealmAnyタイプのプロパティを持つデータモデルを同期できません。

クライアントから同期された Realm にアクセスする前に、次の操作を行う必要があります。

  1. App Services UI で同期を有効にします。

  2. アプリを初期化

  3. アプリケーションレベルのbuild.gradleファイルの最上位に以下を追加して、アプリケーション内で同期を有効にします。

    realm { syncEnabled = true }
  4. クライアント プロジェクトでユーザーを認証します。

同期された Realm はAtlas Device Syncを使用して、クライアントデバイスと同期されたデータソースの両方にデータを保存します。 同期された Realm の起動は、同期された Realm の設定をカスタマイズするためにSyncConfigurationを使用することを除いて、ローカル 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() {
@Override
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() {
@Override
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
)
}
}

Tip

以下も参照してください。

サブスクライブの詳細については、「 クエリ可能なフィールドのサブスクライブ 」を参照してください。

重要

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() {
@Override
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() {
@Override
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 を開くことができます。 すべての SDK がこのパターンに従うわけではないため、クロスプラットフォーム開発者は各 SDK のドキュメントを参照して詳細を確認する必要があります。

Realm インスタンスでリソースを解放する場合は、 close()メソッドを呼び出すことが重要です。 を無視して Realm を閉じると、 OutOfMemoryErrorが発生する可能性があります。

realm.close();
realm.close()

戻る

同期データ