Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

同期サブスクリプションの管理 - C++ SDK

項目一覧

  • 前提条件
  • バックエンド アプリによるサブスクリプションの整合性
  • サブスクリプションを管理する
  • サブスクリプション数を確認または特定のサブスクリプションを検索する
  • 同期サブスクリプションを追加する
  • タイプのすべてのオブジェクトへのサブスクライブ
  • クエリに一致するオブジェクトをサブスクライブ
  • 同期サブスクリプションの更新
  • 同期サブスクリプションの削除
  • 特定のサブスクリプションを削除する
  • すべてのサブスクリプションを削除
  • サブスクリプション更新後に Realm を更新する

Flexible Sync は、サブスクリプションと権限を使用して、Atlas App Services Appとクライアント デバイス間で同期するデータを決定します。 クライアントでは、クエリ サブスクリプションによって、Realm に同期できるオブジェクトタイプが管理およびフィルタリングされます。

アプリで Flexible Sync を使用するには、次の手順を実行する必要があります。

  • バックエンドでの Flexible Sync の構成

  • アプリを初期化

  • ユーザーの認証

  • Flexible Sync 構成で同期された Realm を開きます

このページの例のセットアップ コードは、これらの前提条件を処理します。

// Initialize the App, authenticate a user, and open the database
auto appConfig = realm::App::configuration();
appConfig.app_id = APP_ID;
auto app = realm::App(appConfig);
auto user = app.login(realm::App::credentials::anonymous()).get();
auto syncConfig = user.flexible_sync_configuration();
auto syncedRealm = realm::db(syncConfig);

さらに、同期で使用されるモデルには、 _idという名前のプライマリキー プロパティが含まれている必要があります。 プライマリキーを使用してモデルを定義する方法の詳細については、「 プライマリキーの指定 」を参照してください。

クライアント側のサブスクリプション クエリは、バックエンド App Services App の Device Sync 構成と一致する必要があります。

サブスクライブ クエリは、次のいずれかになります。

  • タイプのすべてのオブジェクトをクエリします。

  • バックエンド アプリのクエリ可能なフィールドと一致するタイプのクエリ オブジェクト。

クエリ可能なフィールドの構成の詳細については、App Services ドキュメントの「 クエリ可能なフィールド」を参照してください。

同期された Realm では、Realm へのデータの読み取りと書込みを可能にするために 1 つ以上のサブスクリプションが必要です。 1 つ以上のサブスクリプション一致し、ユーザーの権限に一致するデータのみを Realm に書き込むことができます。 サブスクリプションに一致しない Realm にオブジェクトを書込み (write) しようとすると、サーバーからの置換書込み (write) が行われ、書込み (write) は元に戻ります。

バックエンドで Flexible Sync を構成するときは、クライアント アプリケーションがクエリできるフィールドを指定します。 クライアント アプリケーションでは、 sync_subscription_setは、Realm に保存できるオブジェクトを決定する 0 個以上のsync_subscriptionオブジェクトのリストです。

Realm C++ SDK には、 sync_subscriptionオブジェクトを追加、変更、削除できるMutable_sync_subscription_setもあります。

警告

クエリ サイズの制限

サブスクリプションセット内の特定のクエリ サブスクライブのサイズ制限256 kBです。 この制限を超えると、 LimitsExceeded エラー が発生します。

アプリが同期された Realm を初めて開くときに、予想されるサブスクリプション数があるか、特定のサブスクライブがあることを確認する必要がある場合があります。

この情報は、 Realmsubscriptions()公開ノード関数にアクセスすることで取得できます。 これにより、 size()またはfind()メンバー関数を使用できるsync_subscription_setが提供されます。

// Check the subscription count
CHECK(syncedRealm.subscriptions().size() == 1);
// Find a specific subscription by name
auto puppySubscription = *syncedRealm.subscriptions().find("puppies");
CHECK(puppySubscription.name == "puppies");
// Get information about the subscription
CHECK(puppySubscription.object_class_name == "Dog");
CHECK(puppySubscription.query_string == "age < 3");

サブスクリプションセットを更新するには、 subscription().updates()関数を使用します。 これにより、 Mutable_sync_subscription_setにアクセスでき、 add()関数を使用して新しい同期サブスクリプションを追加できます。

このテンプレートには、同期するオブジェクトのオブジェクトタイプと、サブスクライブのstring名が必要です。

タイプのすべてのオブジェクトをサブスクライブできます。 これにより、同期された Realm は、ユーザーの権限がサーバー側の権限と一致するタイプのオブジェクトを読み書きできるようになります。

auto updateSubscriptionSuccess =
syncedRealm.subscriptions()
.update([](realm::mutable_sync_subscription_set &subs) {
subs.add<realm::Dog>("dogs");
})
.get();
// The .update() function returns a bool, which confirms whether or not the
// update succeeded
REQUIRE(updateSubscriptionSuccess == true);
// You can check the .size() of the subscription set, which tells you the
// number of sync_subscription objects in the set
CHECK(syncedRealm.subscriptions().size() == 1);

オブジェクトのサブセットのみをサブスクライブする場合は、サブスクリプションをフィルタリングするためのクエリを提供します。

updateSubscriptionSuccess =
syncedRealm.subscriptions()
.update([](realm::mutable_sync_subscription_set &subs) {
subs.add<realm::Dog>(
"puppies", [](auto &obj) { return obj.age < 3; });
})
.get();
REQUIRE(updateSubscriptionSuccess == true);
CHECK(syncedRealm.subscriptions().size() == 1);

サブスクリプションをフィルタリングする場合、フィルターに一致しないオブジェクトを書き込むことはできません。 この例では、クエリは、 age3より小さいDogオブジェクトと一致します。 Realm は 3 以上のログを同期しません。 このフィルターは、書込み (write) にも適用されます。 age4であるDogオブジェクトを書込み (write) しようとすると、 埋め込みエラーが発生し、書込みが元に戻ります。

注意

C++ SDK はまだ、他の SDK が提供するクエリ式の全範囲をサポートしていません。

サブスクリプションセットを更新するには、 subscription().updates()関数を使用します。 これにより、 Mutable_sync_subscription_setにアクセスでき、 update_subscription()関数を使用して特定のsync_subscription を更新できます。

アップデート内でsync_subscriptionのクエリを変更できます。 特定の sync_subscription のクエリstringを追加、削除、またはアップデートできます。

updateSubscriptionSuccess =
syncedRealm.subscriptions()
.update([](realm::mutable_sync_subscription_set &subs) {
subs.update_subscription<realm::Dog>(
"puppies", [](auto &obj) { return obj.age < 2; });
})
.get();
REQUIRE(updateSubscriptionSuccess == true);

サブスクリプションセットを更新するには、 subscription().updates()関数を使用します。 これにより、 Mutable_sync_subscription_setにアクセスでき、 remove()またはclear()関数を使用してサブスクライブを削除できます。

remove()関数を使用して、名前で特定のサブスクリプションを削除できます。 サブスクリプションを名前で削除すると、サブスクリプションが存在しない場合にエラーがスローされるため、削除する前にサブスクリプションを確認する必要があります。

auto removeSubscriptionSuccess =
syncedRealm.subscriptions()
.update([](realm::mutable_sync_subscription_set &subs) {
subs.remove("dogs");
})
.get();
REQUIRE(removeSubscriptionSuccess == true);

clear()関数を使用して、サブスクライブセット内のすべてのサブスクライブを削除できます。

// You can use .clear() inside a mutable_sync_subscription_set to clear all
// sync_subscription objects from the set
auto updateSubscriptionSuccess =
syncedRealm.subscriptions()
.update(
[](realm::mutable_sync_subscription_set &subs) { subs.clear(); })
.get();
CHECK(updateSubscriptionSuccess == true);
CHECK(syncedRealm.subscriptions().size() == 0);

サブスクリプションを更新した後、 Realmrefresh()を呼び出します。 これにより、Realm によって管理される Realm と未処理のオブジェクトが最新データを指すように更新されます。

syncedRealm.refresh();

戻る

同期データ