Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

동기화 구독 관리 - C++ SDK

이 페이지의 내용

  • 전제 조건
  • 백엔드 앱과 구독 정렬
  • 구독 관리
  • 구독 수 확인 또는 특정 구독 찾기
  • 동기화 구독 추가
  • 유형의 모든 객체 구독
  • 쿼리와 일치하는 객체 구독
  • 동기화 구독 업데이트
  • 동기화 구독 제거
  • 특정 구독 제거
  • 모든 구독 제거
  • 구독 업데이트 후 Realm 새로 고침

Flexible Sync는 구독 및 권한을 사용하여 Atlas App Services App과 클라이언트 디바이스 간에 동기화할 데이터를 결정합니다. 클라이언트에서 쿼리 구독은 Realm 객체 유형을 managed하고 필터링합니다.

앱에서 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 앱의 Device Sync 구성과 일치해야 합니다.

구독 쿼리는 다음 중 하나를 수행할 수 있습니다.

  • 유형의 모든 객체를 쿼리합니다.

  • 백엔드 앱의 쿼리 가능 필드와 일치하는 유형의 쿼리 객체입니다.

쿼리 가능 필드 구성에 대해 자세히 알아보려면 App Services 문서에서 쿼리 가능 필드를 참조하세요.

동기화 영역에 데이터를 읽고 쓸 수 있으려면 하나 이상의 구독이 있어야 합니다. 하나 이상의 구독 일치하고 사용자의 권한과 일치하는 영역에만 데이터를 쓸 수 있습니다. 구독과 일치하지 않는 영역에 객체를 쓰려고 하거나 사용자에게 쓰기를 수행할 수 있는 권한이 없는 객체를 쓰려고 하면 서버에서 보상 쓰기를 받고 쓰기가 되돌려집니다.

백엔드에서 Flexible Sync를 구성할 때 클라이언트 애플리케이션이 쿼리할 수 있는 필드를 지정합니다. 클라이언트 애플리케이션에서 sync_subscription_set 은 Realm이 저장할 수 있는 객체를 결정하는 0개 이상의 sync_subscription 객체 목록입니다.

Realm C++ SDK에는 sync_subscription 객체를 추가, 변경 및 제거할 수 있는 mutable_sync_subscription_set 도 있습니다.

경고

쿼리 크기 제한

구독 설정하다 에 있는 특정 쿼리 구독 의 크기 제한256 KB 입니다. 이 제한을 초과하면 LimitsExceeded 오류가 발생합니다.

앱에서 동기화된 영역을 처음 열 때 예상되는 구독 수 또는 특정 구독이 있는지 확인해야 할 수 있습니다.

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() 함수를 사용합니다. 이렇게 하면 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);

구독을 필터링할 때 필터와 일치하지 않는 객체를 작성할 수 없습니다. 이 예제에서 쿼리는 age3 미만인 Dog 객체와 일치합니다. 영역은 3세 이상의 개를 동기화하지 않습니다. 이 필터는 쓰기에도 적용됩니다. age4Dog 객체를 작성하려고 하면 보상 쓰기 오류가 발생하고 쓰기가 되돌아갑니다.

참고

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 에서 refresh() 를 호출합니다. 이렇게 하면 영역과 해당 영역에서 관리하는 미해결 객체가 가장 최근 데이터를 가리키도록 업데이트됩니다.

syncedRealm.refresh();

돌아가기

데이터 동기화