Configurar e abrir um Realm sincronizado - .NET SDK
Nesta página
- Domínios sincronizados
- Realms sincronizados versus Realms não sincronizados
- Converter entre realms sincronizados e não sincronizados
- Domínios sincronizados
- Abrir um realm sincronizado
- Abrir um Realm sincronizado enquanto estiver online
- Abrir um Realm sincronizado enquanto estiver offline
- Configurar tempos limite com AppConfiguration
- Definindo o escopo do Realm
- Subconjuntos de classes
Domínios sincronizados
Você pode configurar um domínio para sincronizar automaticamente os dados entre vários dispositivos, cada um com sua própria cópia local dos dados. Os domínios sincronizados usam uma configuração diferente dos domínios somente locais e exigem um backend do Atlas App Services para lidar com o processo de sincronização.
Os aplicativos podem sempre criar, modificar e excluir objetos de Realm sincronizados localmente, mesmo quando estiver offline. Sempre que uma conexão de rede está disponível, o Realm SDK abre uma conexão com um servidor de aplicação e sincroniza as alterações de e para outros clientes. O protocolo Atlas Device Sync e as transformações operacionais do lado do servidor garantem que todas as instâncias totalmente sincronizadas de um Realm vejam exatamente os mesmos dados, mesmo que algumas alterações tenham ocorrido offline e/ou tenham sido recebidas fora de ordem.
Dica
Saiba como configurar e usar a sincronização
Para obter mais informações sobre o Realm Mobile Sync, incluindo instruções sobre como configurar a sincronização em um aplicativo do App Services, consulte Sincronizar dados entre dispositivos - .NET SDK.
Realms sincronizados versus Realms não sincronizados
Os domínios sincronizados diferem dos Realm locais não sincronizados de algumas maneiras:
Os realms sincronizados tentam sincronizar as alterações com os aplicativos de backend do App Services, enquanto os realms não sincronizados, não.
Os realms sincronizados podem ser acessados por usuários autenticados, enquanto os realms não sincronizados não têm nenhum conceito de usuários ou autenticação.
Você pode copiar dados de um domínio não sincronizado para um domínio sincronizado e vice-versa, mas não é possível sincronizar um domínio não sincronizado.
Converter entre realms sincronizados e não sincronizados
Para converter um Realm não sincronizado em um Realm sincronizado, você pode seguir o processo descrito em Migrar um aplicativo somente local para um aplicativo habilitado para sincronização. O .NET SDK também fornece o método WriteCopy() , que permite duplicar os dados de um domínio não sincronizado para um Realm de sincronização. Para obter mais informações, consulte Migrar de domínios não sincronizados para domínios sincronizados.
Observação
Somente sincronização baseada em partição
Esse método oferece suporte apenas à conversão entre um realm não sincronizado e a sincronização baseada em partição. Se seu aplicativo usa a Flexible Sync, você deve iterar manualmente pelos objetos em um território e copiá-los para o outro realm.
Domínios sincronizados
Para abrir um Realm sincronizado, você deve ter um objeto de usuário autenticado. Para obter uma instância inicial do User
, você precisa autenticar no backend do Atlas App Services , que exige que o dispositivo esteja online na primeira vez que um usuário fizer login. Após a autenticação inicial, você poderá recuperar um usuário existente enquanto estiver off-line.
Observação
Na primeira vez que um usuário fizer login no seu aplicativo, você deve abrir o Realm de forma assíncrona para sincronizar os dados do servidor com o dispositivo em um thread no background. Após essa sincronização inicial, você pode abrir um domínio de forma síncrona para garantir que o aplicativo funcione em um estado offline.
Abrir um realm sincronizado
O fluxo típico para abrir um domínio sincronizado envolve:
Criando uma configuração de sincronização.
Abrindo o domínio sincronizado do usuário com a configuração.
Na autenticação, armazenamos credenciais de usuário em cache em um arquivo sync_metadata.realm
no dispositivo.
Ao abrir uma região sincronizada após a autenticação, você pode ignorar o fluxo de login e ir diretamente para a abertura da região sincronizada, usando a mesma configuração de sincronização já criada.
Com credenciais em cache, você pode:
Abra um realm sincronizado imediatamente com os dados que estão no dispositivo. Você pode usar esse método offline ou online.
Abra um domínio sincronizado após baixar as alterações de seu aplicativo. Isso exige que o usuário tenha uma conexão ativa com a Internet.
Abrir um Realm sincronizado enquanto estiver online
As etapas para abrir um Realm sincronizado enquanto estiver online são:
O código do seu aplicativo orienta o usuário na autenticação.
Crie um objeto FlexibleSyncConfiguration que inclua o objeto de usuário .
Abra um Realm sincronizado chamando o método GetInstanceAsync() .
Se sua FlexibleSyncConfiguration não continha assinaturas iniciais, adicione uma assinatura.
O seguinte código demonstra estas etapas:
var app = App.Create("myRealmAppId"); var user = await app.LogInAsync(Credentials.Anonymous()); Realm realm; var config = new FlexibleSyncConfiguration(user) { PopulateInitialSubscriptions = (realm) => { var allTasks = realm.All<MyTask>(); realm.Subscriptions.Add(allTasks, new SubscriptionOptions { Name = "allTasks" }); } }; try { realm = await Realm.GetInstanceAsync(config); } catch (Exception ex) { Console.WriteLine($@"Error creating or opening the realm file. {ex.Message}"); }
No exemplo acima, o código mostra como abrir o domínio de forma assíncrona chamando GetInstanceAsync()
. Você também pode abrir um domínio de forma síncrona chamando o método GetInstance() :
var synchronousRealm = Realm.GetInstance(config);
Abrir um Realm sincronizado enquanto estiver offline
Após o usuário autenticar, o objeto User
persiste no dispositivo até que o usuário faça logout. Isso permite que seu aplicativo recupere um usuário existente e abra um Realm sincronizado em um estado offline. As alterações que ocorrem enquanto estiver offline serão sincronizadas pelo SDK assim que o dispositivo for reconectado ao seu aplicativo.
O código a seguir mostra como verificar se há um objeto User
existente. Se nenhum for encontrado, ele usará o processo descrito sobre para obter um usuário. If the device already has a user
, it opens the synced realm with that user:
var app = App.Create("myRealmAppId"); Realms.Sync.User user; FlexibleSyncConfiguration config; Realm realm; if (app.CurrentUser == null) { // App must be online for user to authenticate user = await app.LogInAsync(Credentials.Anonymous()); config = new FlexibleSyncConfiguration(user); realm = Realm.GetInstance(config); // Go on to add or update subscriptions and use the realm } else { // This works whether online or offline // It requires a user to have been previously authenticated user = app.CurrentUser; config = new FlexibleSyncConfiguration(user); realm = Realm.GetInstance(config); // Go on to add or update subscriptions and use the realm }
Configurar tempos limite com AppConfiguration
Para controle granular da conexão do seu aplicativo, você pode definir o SyncTimeoutOptions no objeto AppConfiguration . Você pode definir as seguintes propriedades de tempo limite de sincronização:
ConnectTimeout
: a quantidade de tempo para permitir que uma conexão se torne totalmente estabelecida.ConnectionLingerTime
: a quantidade de tempo para manter uma conexão aberta depois que todas as sessões tiverem sido interrompidas.PingKeepAlivePeriod
: a quantidade de tempo entre cada mensagem de ping de pulsaçãoPongKeepAliveTimeout
: a quantidade de tempo para aguardar uma resposta a um ping de pulsação antes de concluir que a conexão falhou.FastReconnectLimit
: o tempo desde a perda de uma conexão anterior para que uma nova conexão seja considerada uma "reconexão rápida".
AppConfiguration configuration = new AppConfiguration("myRealmAppId") { SyncTimeoutOptions = new SyncTimeoutOptions() { ConnectTimeout = TimeSpan.FromMinutes(2), ConnectionLingerTime = TimeSpan.FromSeconds(30), PingKeepAlivePeriod = TimeSpan.FromMinutes(1), PongKeepAliveTimeout = TimeSpan.FromMinutes(1), FastReconnectLimit = TimeSpan.FromMinutes(1), }, };
Definindo o escopo do Realm
A Instância de Realm implementa o IDisposable
para garantir que os recursos nativos sejam liberados. Você deve descartar um Objeto de Realm imediatamente após o uso, especialmente em threads em segundo plano. A maneira mais simples de fazer isso é declarar o Objeto de Realm com uma declaração using
ou encapsular o código que interage com um Realm em uma declaração using (...)
:
config = new PartitionSyncConfiguration("myPart", user); using (var realm = Realm.GetInstance(config)) { var allItems = realm.All<Item>(); }
Se você precisar que um objeto de domínio seja compartilhado fora de um único método, certifique-se de gerenciar seu estado chamando o método Dispose () :
realm.Dispose();
Observação
Como regra geral, você deve descartar o Realm somente em threads em background, porque a eliminação de um Realm invalida todos os objeto associados a essa instância. Se você estiver vinculando dados aos Objeto de Realm na thread principal, por exemplo, não deverá chamar Dispose()
.
Subconjuntos de classes
Por padrão, todas as classes do RealmObject
são armazenadas em um domínio. Em alguns cenários, talvez você queira limitar as classes que são armazenadas, o que você pode fazer com a propriedade Esquema do objeto RealmConfiguration
. O código a seguir demonstra como você especifica duas classes que deseja armazenar no domínio:
var config = new RealmConfiguration() { Schema = new Type[] { typeof(AClassWorthStoring), typeof(AnotherClassWorthStoring) } };