Sincronização de dados offline
Nota
Este produto está desativado. Para obter uma substituição para projetos que usam o .NET 8 ou posterior, consulte a biblioteca datasync do Kit de Ferramentas da Comunidade .
A sincronização de dados offline é um recurso do SDK dos Aplicativos Móveis do Azure. Os dados são armazenados em um repositório local. Quando o aplicativo estiver offline, você ainda poderá criar, modificar e pesquisar os dados. Os dados são sincronizados com o serviço aplicativos móveis do Azure quando o dispositivo está online. O SDK dá suporte à resolução de conflitos quando o mesmo registro é alterado no cliente e no serviço.
A sincronização offline tem vários benefícios:
- Melhora a capacidade de resposta do aplicativo
- Melhora a confiabilidade do aplicativo quando há conectividade de rede incorreta
- Limita o uso de rede em redes limitadas ou de alta latência
- Dá suporte ao uso desconectado
Os tutoriais a seguir mostram como adicionar sincronização offline aos seus clientes móveis usando os Aplicativos Móveis do Azure:
- Avalonia: habilitar de sincronização offline
- .NET MAUI: habilitar a sincronização offline
- Plataforma uno do : habilitar a sincronização offline
- Windows (UWP): habilitar a sincronização offline
- Windows (WinUI3): habilitar a sincronização offline
- Windows (WPF): habilitar a sincronização offline
- Xamarin.Android: habilitar a sincronização offline
- Xamarin.Forms: habilitar a sincronização offline
- Xamarin.iOS: habilitar a sincronização offline
O que é uma tabela de sincronização?
Os SDKs de Aplicativos Móveis do Azure fornecem IRemoteTable<T>
, que acessa o serviço diretamente. A operação falhará se o dispositivo não tiver uma conexão de rede. Uma tabela de sincronização (fornecida por IOfflineTable<T>
) fornece as mesmas operações em um repositório local. O repositório local pode ser sincronizado com o serviço posteriormente. Antes de executar qualquer operação, você deve inicializar o repositório local.
O que é um repositório local?
Um repositório local é a camada de persistência de dados no dispositivo cliente. A maioria das plataformas usa SQLite para o repositório local, mas o iOS usa Dados Principais. Você também pode implementar seu próprio repositório local. Por exemplo, use uma versão do SQLite com SQLCipher para produzir um repositório criptografado.
Como funciona a sincronização offline?
O código do cliente controla quando as alterações locais são sincronizadas com um serviço de sincronização de dados. Nada é enviado ao serviço até que você enviar por push alterações locais. Da mesma forma, o repositório local é preenchido com dados novos ou atualizados somente quando você efetuar pull dados.
Você pode enviar por push operações pendentes para todas as tabelas, uma lista de tabelas ou uma tabela:
// All tables
await client.PushTablesAsync();
// A list of tables
var tablesToPush = new string[] { "table1", "table2" };
await client.PushTablesAsync(tablesToPush);
// A single table
await table.PushItemsAsync();
Sincronização
A operação de push envia todas as alterações pendentes na fila de operações para o serviço. A alteração pendente é enviada ao serviço por meio de uma chamada HTTP REST, que, por sua vez, modifica seu banco de dados.
As operações de push são feitas antes de qualquer operação de pull. A operação de pull extrai dados alterados do serviço e os armazena no repositório local.
Push implícito
Se você executar um pull em uma tabela com atualizações locais pendentes, o pull primeiro executará um push para essa tabela. Esse push ajuda a minimizar conflitos entre alterações que já estão na fila e novos dados do servidor. Opcionalmente, você pode configurar um push de todas as tabelas definindo PushOtherTables
em PullOptions
:
var pullOptions = new PullOptions { PushOtherTables = true };
await table.PullItemsAsync(pullOptions);
Puxando um subconjunto de registros
Opcionalmente, você pode especificar uma consulta usada para determinar quais registros devem ser incluídos no banco de dados offline. Por exemplo:
var query = table.CreateQuery().Where(x => x.Color == "Blue");
await table.PullItemsAsync(query);
Sincronização incremental
Os Aplicativos Móveis do Azure implementam a sincronização incremental. Somente os registros que foram alterados desde a última operação de pull são extraídos. A sincronização incremental economiza tempo e largura de banda ao processar tabelas grandes.
Para cada consulta exclusiva, o campo UpdatedAt
do último registro transferido com êxito é armazenado como um token no repositório offline. O último valor de UpdatedAt
é armazenado no repositório de token delta. O repositório de token delta é implementado como uma tabela no repositório offline.
Desempenho e consistência
Às vezes, a sincronização é interrompida prematuramente. Por exemplo:
- A rede que você está usando para sincronização fica indisponível durante o processo de sincronização.
- Você força o fechamento do aplicativo durante a sincronização.
Para minimizar o risco de um problema de consistência dentro do banco de dados offline, cada registro é gravado no banco de dados conforme ele é recebido. Opcionalmente, você pode decidir gravar os registros no banco de dados em lotes. As operações em lote aumentam o desempenho das gravações do banco de dados offline durante a operação de pull. No entanto, eles também aumentam o risco de uma inconsistência entre os metadados da tabela e os dados dentro da tabela.
Você pode ajustar o intervalo entre gravações da seguinte maneira:
var pullOptions = new PullOptions { WriteDeltaTokenInterval = 25 };
await table.PullItemsAsync(pullOptions);
Esse código coleta gravações em lotes de 25 registros. Testes de desempenho sugerem que o desempenho melhora até um valor de 25. Um valor de WriteDeltaTokenInterval
maior que 25 não melhora significativamente o desempenho.
Purga
Você pode limpar o conteúdo do repositório local usando IOfflineTable<T>.PurgeItemsAsync
. A limpeza pode ser necessária se você tiver dados obsoletos no banco de dados cliente ou se quiser descartar todas as alterações pendentes. Uma limpeza limpa uma tabela do repositório local. Para limpar uma tabela:
await table.PurgeItemsAsync("", new PurgeOptions());
O método PurgeItemsAsync()
gerará um erro InvalidOperationException
se houver alterações pendentes na tabela. Nesse caso, você pode forçar a limpeza a acontecer:
await table.PurgeItemsAsync("", new PurgeOptions { DiscardPendingOperations = true });
A limpeza é um último recurso para limpar uma tabela no repositório offline, pois apaga todos os registros do cache e exige que você as baixe novamente.