Gerenciar assinaturas de sincronização - C++ SDK
Nesta página
- Pré-requisitos
- Alinhe assinaturas com aplicativo de backend
- Gerenciar suas assinaturas
- Verificar o número de assinaturas ou encontrar uma assinatura específica
- Adicionar assinaturas de sincronização
- Assinar todos os objetos de um tipo
- Assine objetos que correspondem a uma query
- Atualizar assinaturas de sincronização
- Remover subscrições de sincronização
- Remover uma assinatura específica
- Remover todas as assinaturas
- Atualizar o Realm após atualizar assinaturas
O Flexible Sync usa assinaturas e permissões para determinar quais dados sincronizar entre seu Atlas App Services App e seu dispositivo cliente. No cliente, as assinaturas de query managed e filtram os Tipo de objeto de Realm que podem ser sincronizados com o Realm.
Pré-requisitos
Para usar a Flexible Sync em seu aplicativo, você deve:
O código de configuração para os exemplos nesta página lida com estes pré-requisitos:
// 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);
Além disso, os modelos usados com o Sync devem conter uma propriedade de chave primária chamada _id
. Para obter mais informações sobre como definir um modelo com uma chave primária, consulte Especificar uma chave primária.
Alinhe assinaturas com aplicativo de backend
Suas queries de assinatura do lado do cliente devem estar alinhadas com a configuração do Device Sync em seu aplicativo de serviços de aplicativo de backend.
Suas query de assinatura podem:
query todos os objeto de um tipo.
query objeto de um tipo que corresponda aos campo de query do aplicativo de backend.
Para saber mais sobre como configurar campos consultáveis, consulte Campos de query na documentação do Atlas App Services .
Um Realm sincronizado deve ter uma ou mais assinaturas para poder ler e gravar dados no Realm. Você só pode gravar dados no Realm que correspondam a uma ou mais assinaturas e que correspondam às permissões do usuário. Se você tentar gravar objeto em um Realm que não corresponde a uma assinatura ou para o qual o usuário não tem permissão para realizar a gravação, receberá uma gravação compensatória do servidor e a gravação será revertida.
Gerenciar suas assinaturas
Ao configurar o Flexible Sync no backend, você especifica quais campos seu aplicativo cliente pode executar uma query. No aplicativo cliente, sync_subscription_set é uma lista de zero ou mais objetos sync_subscription que determinam quais objetos o domínio pode armazenar.
O Realm C++ SDK também tem um mutable_sync_subscription_set que permite adicionar, alterar e remover objetos sync_subscription
.
Aviso
Limite de tamanho da query
O limite de tamanho para qualquer assinatura de query em seu conjunto de assinatura é de 256 kB. Exceder esse limite resulta em um erro de LimitsExceeded.
Verificar o número de assinaturas ou encontrar uma assinatura específica
Quando seu aplicativo abre pela primeira vez um Realm sincronizado, você pode querer verificar se ele tem o número esperado de assinaturas ou se tem uma assinatura específica.
Você pode obter essas informações acessando a função de membro público subscriptions()
de um realm. Isso fornece o sync_subscription_set onde você pode usar as funções de membro size()
ou find()
.
// 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");
Adicionar assinaturas de sincronização
Para atualizar um conjunto de assinaturas, use a função subscription().updates()
. Isso lhe dá acesso a um mutable_sync_subscription_set onde você pode usar a função add()
para adicionar uma nova assinatura de sincronização.
Este modelo requer o Tipo de objeto de Realm do objeto que você deseja sincronizar e um nome de string para a assinatura.
Assinar todos os objetos de um tipo
Você pode assinar todos os objetos de um tipo. Isso permite que o Realm sincronizado leia e grave qualquer objeto do tipo em que as permissões do usuário correspondam às permissões do lado do 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);
Assine objetos que correspondem a uma query
Se você quiser assinar apenas um subconjunto de objetos, forneça uma query para filtrar a assinatura.
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);
Ao filtrar uma assinatura, você não pode gravar objetos que não correspondem ao filtro. Neste exemplo, a query corresponde a objetos Dog
cujo age
é menor que 3
. O Realm não sincroniza nenhum cão que tenha 3 anos ou mais. Esse filtro também se aplica a gravações. Se você tentar gravar um objeto Dog
onde age
é 4
, receberá um erro de gravação compensatório e a gravação será revertida.
Observação
O C++ SDK ainda não oferece suporte a toda a gama de expressão query que os outros SDKs fornecem.
Atualizar assinaturas de sincronização
Para atualizar um conjunto de assinaturas, use a função subscription().updates()
. Isso lhe dá acesso a um mutable_sync_subscription_set onde você pode usar a função update_subscription()
para atualizar um sync_subscription específico.
Você pode alterar a query de um sync_subscription
em uma atualização. Você pode adicionar, remover ou atualizar a string de query para um determinado 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);
Remover subscrições de sincronização
Para atualizar um conjunto de assinaturas, use a função subscription().updates()
. Isso lhe dá acesso a um mutable_sync_subscription_set onde você pode usar as funções remove()
ou clear()
para remover assinaturas.
Remover uma assinatura específica
Você pode remover uma assinatura específica por nome usando a função remove()
. Remover uma assinatura por nome gera um erro se a assinatura não existir, portanto, você deve verificar se há uma assinatura antes de removê-la.
auto removeSubscriptionSuccess = syncedRealm.subscriptions() .update([](realm::mutable_sync_subscription_set &subs) { subs.remove("dogs"); }) .get(); REQUIRE(removeSubscriptionSuccess == true);
Remover todas as assinaturas
Você pode remover todas as assinaturas em um conjunto de assinaturas utilizando a função 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);
Atualizar o Realm após atualizar assinaturas
Depois de atualizar as assinaturas, chame refresh()
no realm. Isso atualiza o realm e os objetos pendentes gerenciados pelo realm para apontar para os dados mais recentes.
syncedRealm.refresh();