Docs Menu
Docs Home
/ /
Sincronizar datos

Administrar suscripciones de sincronización - SDK de C++

Flexible Sync utiliza suscripciones y permisos para determinar qué datos sincronizar entre la aplicación Atlas App Services y el dispositivo cliente. En el cliente, las suscripciones de consulta administran y filtran los tipos de objetos que se pueden sincronizar con el dominio.

Para utilizar Flexible Sync en tu aplicación, debes:

  • Configurar la sincronización flexible en el backend

  • Inicializar la aplicación

  • Autenticar un usuario

  • Abra el reino sincronizado con una configuración de sincronización flexible

El código de configuración para los ejemplos de esta página maneja estos requisitos previos:

// 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);

Además, los modelos utilizados con Sync deben contener una propiedad de clave principal denominada _idPara obtener más información sobre cómo definir un modelo con una clave principal, consulte Especificar una clave principal.

Las consultas de suscripción del lado del cliente deben estar alineadas con la configuración de sincronización del dispositivo en su aplicación de servicios de aplicaciones de backend.

Sus consultas de suscripción pueden:

  • Consultar todos los objetos de un tipo.

  • Objeto de consulta de un tipo que coincide con los campos consultables de la aplicación backend.

Para obtener más información sobre cómo configurar campos consultables, consulte Campos consultables en la documentación de App Services.

Un dominio sincronizado debe tener una o más suscripciones para poder leer y escribir datos en él. Solo se pueden escribir datos en el dominio que coincida con una o más suscripcionesy con los permisos del usuario. Si se intenta escribir objetos en un dominio que no coincide con una suscripción, o para el cual el usuario no tiene permiso para realizar la escritura, se obtiene una escritura compensatoria del servidor y la escritura se revierte.

Al configurar la sincronización flexible en el backend, se especifican los campos que la aplicación cliente puede consultar. En la aplicación cliente, sync_subscription_set es una lista de cero o más objetos sync_subscription que determinan qué objetos puede almacenar el dominio.

El SDK Realm C++ también tiene un mutable_sync_subscription_set que le permite agregar, cambiar y eliminar sync_subscription objetos.

Advertencia

Límite de tamaño de consulta

El límite de tamaño para cualquier suscripción de consulta en su conjunto de suscripciones es de kB. Superar este límite genera 256 un error "LimitsExceeded".

Cuando su aplicación abra por primera vez un reino sincronizado, es posible que desee verificar que tenga la cantidad esperada de suscripciones o que tenga una suscripción específica.

Puede obtener esta información accediendo a la subscriptions() función miembro pública de un dominio. Esto proporciona el conjunto de suscripciones de sincronización, donde puede usar las size() find() funciones miembro u.

// 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");

Para actualizar un conjunto de suscripciones, usa la función subscription().updates(). Esto te da acceso a un mutable_sync_subscription_set donde puedes usar la función add() para añadir una nueva suscripción de sincronizar.

Esta plantilla requiere el tipo de objeto Realm que deseas sincronizar, y un nombre de string para la suscripción.

Puede suscribirse a todos los objetos de un tipo. Esto permite que el dominio sincronizado lea y escriba cualquier objeto del tipo cuyos permisos del usuario coincidan con los del servidor.

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);

Si solo desea suscribirse a un subconjunto de objetos, proporcione una consulta para filtrar la suscripción.

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);

Cuando filtras una suscripción, no puedes guardar objetos que no correspondan con el filtro. En este ejemplo, la query coincide con Dog objetos cuyo age es menor que 3. El realm no sincroniza a ningún perro de 3 años o más. Este filtro también se aplica a los guardados. Si intentas escribir un objeto Dog donde el age es 4, obtendrás un error compensatorio de escritura y la escritura se revertirá.

Nota

El SDK de C++ aún no admite la gama completa de expresiones de consulta que proporcionan otros SDK.

Para actualizar un conjunto de suscripciones, use la subscription().updates() función. Esto le da acceso a un conjunto mutable_sync_subscription_set donde puede usar la update_subscription() función para actualizar una suscripción de sincronización específica.

Puedes cambiar la consulta de un sync_subscription en una actualización. Puedes añadir, eliminar o actualizar la cadena de consulta para un sync_subscription determinado.

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);

Para actualizar un conjunto de suscripciones, use la subscription().updates() función. Esto le da acceso a un conjunto de suscripciones mutable_sync_subscription_set donde puede usar las funciones remove() o clear() para eliminar suscripciones.

Puedes eliminar una suscripción específica por nombre usando la función remove(). Eliminar una suscripción por nombre genera un error si no existe, por lo que debes comprobar si existe antes de eliminarla.

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

Puede eliminar todas las suscripciones de un conjunto de suscripciones utilizando la función 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);

Después de actualizar las suscripciones, llame refresh() a en el dominio. Esto actualiza el dominio y los objetos pendientes administrados por este para que apunten a los datos más recientes.

syncedRealm.refresh();

Volver

Sincronizar datos