동기화 구독 관리 - C++ SDK
이 페이지의 내용
Flexible Sync는 구독 및 권한을 사용하여 Atlas App Services App과 클라이언트 디바이스 간에 동기화할 데이터를 결정합니다. 클라이언트에서 쿼리 구독은 Realm 객체 유형을 managed하고 필터링합니다.
전제 조건
앱에서 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 앱의 Device Sync 구성과 일치해야 합니다.
구독 쿼리는 다음 중 하나를 수행할 수 있습니다.
유형의 모든 객체를 쿼리합니다.
백엔드 앱의 쿼리 가능 필드와 일치하는 유형의 쿼리 객체입니다.
쿼리 가능 필드 구성에 대해 자세히 알아보려면 App Services 문서에서 쿼리 가능 필드를 참조하세요.
동기화 영역에 데이터를 읽고 쓸 수 있으려면 하나 이상의 구독이 있어야 합니다. 하나 이상의 구독 과 일치하고 사용자의 권한과 일치하는 영역에만 데이터를 쓸 수 있습니다. 구독과 일치하지 않는 영역에 객체를 쓰려고 하거나 사용자에게 쓰기를 수행할 수 있는 권한이 없는 객체를 쓰려고 하면 서버에서 보상 쓰기를 받고 쓰기가 되돌려집니다.
구독 관리
백엔드에서 Flexible Sync를 구성할 때 클라이언트 애플리케이션이 쿼리할 수 있는 필드를 지정합니다. 클라이언트 애플리케이션에서 sync_subscription_set 은 Realm이 저장할 수 있는 객체를 결정하는 0개 이상의 sync_subscription 객체 목록입니다.
Realm C++ SDK에는 sync_subscription
객체를 추가, 변경 및 제거할 수 있는 mutable_sync_subscription_set 도 있습니다.
구독 수 확인 또는 특정 구독 찾기
앱에서 동기화된 영역을 처음 열 때 예상되는 구독 수 또는 특정 구독이 있는지 확인해야 할 수 있습니다.
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()
함수를 사용합니다. 이렇게 하면 add()
함수를 사용하여 새 동기화 구독을 추가할 수 있는 mutable_sync_subscription_set 에 액세스할 수 있습니다.
이 템플릿에는 동기화하려는 객체의 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
객체와 일치합니다. 영역은 3세 이상의 개를 동기화하지 않습니다. 이 필터는 쓰기에도 적용됩니다. age
가 4
인 Dog
객체를 작성하려고 하면 보상 쓰기 오류가 발생하고 쓰기가 되돌아갑니다.
참고
C++ SDK는 다른 SDK가 제공하는 전체 범위의 쿼리 표현식을 아직 지원하지 않습니다.
동기화 구독 업데이트
구독 세트를 업데이트하려면 subscription().updates()
함수를 사용합니다. 이렇게 하면 함수를 사용하여 특정 sync_subscription 을 업데이트할수 있는 mutable_sync_subscription_set 에 액세스할 수 있습니다.update_subscription()
업데이트에서 sync_subscription
의 쿼리를 변경할 수 있습니다. 지정된 sync_subscription
에 대한 쿼리 문자열을 추가, 제거 또는 업데이트할 수 있습니다.
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()
함수를 사용합니다. 이렇게 하면 remove()
또는 clear()
함수를 사용하여 구독을 제거할 수 있는 mutable_sync_subscription_set 에 액세스할 수 있습니다.
특정 구독 제거
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()
를 호출합니다. 이렇게 하면 영역과 해당 영역에서 관리하는 미해결 객체가 가장 최근 데이터를 가리키도록 업데이트됩니다.
syncedRealm.refresh();