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.
Requisitos previos
Para utilizar Flexible Sync en tu aplicación, debes:
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.
Alinear suscripciones con la aplicación backend
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.
Administra tus suscripciones
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".
Verificar el número de suscripciones o buscar una suscripción específica
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");
Agregar suscripciones de sincronización
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.
Suscribirse a todos los objetos de un tipo
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);
Suscribirse a objetos que coinciden con una consulta
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.
Actualizar suscripciones de sincronización
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);
Eliminar suscripciones de sincronización
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.
Eliminar una suscripción específica
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);
Eliminar todas las suscripciones
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);
Actualizar el reino después de actualizar las suscripciones
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();