Menu Docs
Página inicial do Docs
/ /
Atlas Device SDKs
/ /

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

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.

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.

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.

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.

O fluxo típico para abrir um domínio sincronizado envolve:

  1. Autenticando o usuário.

  2. Criando uma configuração de sincronização.

  3. 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.

As etapas para abrir um Realm sincronizado enquanto estiver online são:

  1. O código do seu aplicativo orienta o usuário na autenticação.

  2. Crie um objeto FlexibleSyncConfiguration que inclua o objeto de usuário .

  3. Abra um Realm sincronizado chamando o método GetInstanceAsync() .

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

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
}

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ção

  • PongKeepAliveTimeout: 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),
},
};

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().

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

Voltar

Adicionar sincronização a um aplicativo