Sincronização de dados offline

A sincronização de dados offline é um recurso do SDK dos Aplicativos Móveis do Azure. Os dados são armazenados em um armazenamento local. Mesmo quando o aplicativo está offline, você pode 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 oferece suporte à resolução de conflitos quando o mesmo registro é alterado no cliente e no serviço.

A sincronização offline proporciona vários benefícios:

  • Melhora a capacidade de resposta do aplicativo
  • Melhora a confiabilidade do aplicativo quando há conectividade de rede ruim
  • Limita o uso da rede em redes limitadas ou de alta latência
  • Suporta uso desconectado

Os tutoriais a seguir mostram como adicionar sincronização offline aos seus clientes móveis usando os Aplicativos Móveis do Azure:

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 ) fornece as mesmas operações em IOfflineTable<T>um repositório local. O armazenamento local pode ser sincronizado com o serviço mais tarde. Antes de executar qualquer operação, você deve inicializar o repositório local.

O que é um armazenamento local?

Um armazenamento local é a camada de persistência de dados no dispositivo cliente. A maioria das plataformas usa o SQLite para o armazenamento local, mas o iOS usa o Core Data. Você também pode implementar o seu armazenamento local. Por exemplo, use uma versão do SQLite com o SQLCipher para produzir um armazenamento 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 para o serviço até que você envie alterações locais. Da mesma forma, o armazenamento local é preenchido com dados novos ou atualizados somente quando você extrai dados.

Você pode enviar 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 efetua pull dos dados alterados do serviço e armazena-os no armazenamento local.

Empurrão implícito

Se você executar um pull em uma tabela que tenha atualizações locais pendentes, o pull primeiro executará um push para essa tabela. Esse envio por push ajuda a minimizar conflitos entre as 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);

Extraindo um subconjunto de registros

Você pode, opcionalmente, 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 UpdatedAt campo do último registro transferido com êxito é armazenado como um token no repositório offline. O último UpdatedAt valor é armazenado no armazenamento de token delta. O armazenamento 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 no banco de dados offline, cada registro é gravado no banco de dados à medida que é recebido. Você pode, opcionalmente, 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 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 as gravações da seguinte maneira:

var pullOptions = new PullOptions { WriteDeltaTokenInterval = 25 };
await table.PullItemsAsync(pullOptions);

Esse código reúne gravações em lotes de 25 registros. O teste de desempenho sugere que o desempenho melhora até um valor de 25. Um WriteDeltaTokenInterval valor maior que 25 não melhora significativamente o desempenho.

Limpeza

Você pode limpar o conteúdo do repositório local usando IOfflineTable<T>.PurgeItemsAsynco . A limpeza pode ser necessária se você tiver dados obsoletos no banco de dados do cliente ou se quiser descartar todas as alterações pendentes. Uma limpeza remove uma tabela do repositório local. Para limpar uma tabela:

await table.PurgeItemsAsync("", new PurgeOptions());

O PurgeItemsAsync() método lança um InvalidOperationException erro 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 armazenamento offline, porque apaga todos os registros do cache e exige que você os baixe novamente.