同期サブスクリプションの管理 - C++ SDK
項目一覧
Flexible Sync は、サブスクリプションと権限を使用して、Atlas App Services Appとクライアント デバイス間で同期するデータを決定します。 クライアントでは、クエリ サブスクリプションによって、Realm に同期できるオブジェクトタイプが管理およびフィルタリングされます。
前提条件
アプリで Flexible Sync を使用するには、次の手順を実行する必要があります。
このページの例のセットアップ コードは、これらの前提条件を処理します。
// 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もあります。
サブスクリプション数を確認または特定のサブスクリプションを検索する
アプリが同期された Realm を初めて開くときに、予想されるサブスクリプション数があるか、特定のサブスクライブがあることを確認する必要がある場合があります。
この情報は、 Realmのsubscriptions()
公開ノード関数にアクセスすることで取得できます。 これにより、 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);
サブスクリプションをフィルタリングする場合、フィルターに一致しないオブジェクトを書き込むことはできません。 この例では、クエリは、 age
が3
より小さいDog
オブジェクトと一致します。 Realm は 3 以上のログを同期しません。 このフィルターは、書込み (write) にも適用されます。 age
が4
である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);
サブスクリプション更新後に Realm を更新する
サブスクリプションを更新した後、 Realmでrefresh()
を呼び出します。 これにより、Realm によって管理される Realm と未処理のオブジェクトが最新データを指すように更新されます。
syncedRealm.refresh();