Sincronizzazione dati offline

La sincronizzazione dei dati offline è una funzionalità SDK di App per dispositivi mobili di Azure. I dati vengono archiviati in un archivio locale. Quando l'app è offline, è comunque possibile creare, modificare ed eseguire ricerche nei dati. I dati vengono sincronizzati con il servizio App per dispositivi mobili di Azure quando il dispositivo è online. L'SDK supporta la risoluzione dei conflitti quando lo stesso record viene modificato sia nel client che nel servizio.

La sincronizzazione offline presenta diversi vantaggi:

  • Migliora la velocità di risposta delle app
  • Migliora l'affidabilità delle app quando la connettività di rete non è valida
  • Limita l'uso della rete in reti a latenza elevata o a consumo
  • Supporta l'uso disconnesso

Le esercitazioni seguenti illustrano come aggiungere la sincronizzazione offline ai client per dispositivi mobili usando App per dispositivi mobili di Azure:

Informazioni sulla tabella di sincronizzazione

Gli SDK di App per dispositivi mobili di Azure forniscono IRemoteTable<T>, che accede direttamente al servizio. L'operazione ha esito negativo se il dispositivo non dispone di una connessione di rete. Una tabella di sincronizzazione (fornita da IOfflineTable<T>) fornisce le stesse operazioni su un archivio locale. L'archivio locale può quindi essere sincronizzato con il servizio in un secondo momento. Prima di eseguire qualsiasi operazione, è necessario inizializzare l'archivio locale.

Informazioni sull'archivio locale

Un archivio locale è un livello di persistenza dei dati nel dispositivo client. La maggior parte delle piattaforme usa SQLite per l'archivio locale, ma iOS usa Core Data. È anche possibile implementare il proprio archivio locale. Ad esempio, usare una versione di SQLite con SQLCipher per produrre un archivio crittografato.

Come funziona la sincronizzazione offline?

Il codice client controlla quando le modifiche locali vengono sincronizzate con un servizio di sincronizzazione dati. Non viene inviato alcun messaggio al servizio finché non si esegue il push delle modifiche locali. Analogamente, l'archivio locale viene popolato con dati nuovi o aggiornati solo quando si estraggono i dati.

È possibile eseguire il push di operazioni in sospeso per tutte le tabelle, un elenco di tabelle o una tabella:

// 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();

Sincronizzazione

L'operazione push invia al servizio tutte le modifiche in sospeso nella coda delle operazioni. La modifica in sospeso viene inviata al servizio tramite una chiamata REST HTTP, che a sua volta modifica il database.

Le operazioni push vengono eseguite prima di qualsiasi operazione pull. L'operazione pull esegue il pull dei dati modificati dal servizio e li archivia nell'archivio locale.

Push implicito

Se si esegue un pull su una tabella con aggiornamenti locali in sospeso, il pull esegue prima un push per tale tabella. Questo push consente di ridurre al minimo i conflitti tra le modifiche già in coda e i nuovi dati dal server. Facoltativamente, è possibile configurare un push di tutte le tabelle impostando PushOtherTables in PullOptions:

var pullOptions = new PullOptions { PushOtherTables = true };
await table.PullItemsAsync(pullOptions);

Pull di un subset di record

Facoltativamente, è possibile specificare una query usata per determinare quali record devono essere inclusi nel database offline. Ad esempio:

var query = table.CreateQuery().Where(x => x.Color == "Blue");
await table.PullItemsAsync(query);

Sincronizzazione incrementale

App per dispositivi mobili di Azure implementa la sincronizzazione incrementale. Vengono estratti solo i record modificati dopo l'ultima operazione pull. La sincronizzazione incrementale consente di risparmiare tempo e larghezza di banda durante l'elaborazione di tabelle di grandi dimensioni.

Per ogni query univoca, il UpdatedAt campo dell'ultimo record trasferito correttamente viene archiviato come token nell'archivio offline. L'ultimo UpdatedAt valore viene archiviato nell'archivio di token delta. L'archivio token differenziale viene implementato come tabella nell'archivio offline.

Prestazioni e coerenza

La sincronizzazione a volte si arresta prematuramente. Ad esempio:

  • La rete usata per la sincronizzazione non è più disponibile durante il processo di sincronizzazione.
  • L'applicazione viene forzata durante la sincronizzazione.

Per ridurre al minimo il rischio di un problema di coerenza all'interno del database offline, ogni record viene scritto nel database durante la ricezione. Facoltativamente, è possibile decidere di scrivere i record nel database in batch. Le operazioni in batch aumentano le prestazioni delle scritture del database offline durante l'operazione pull. Tuttavia, aumentano anche il rischio di incoerenza tra i metadati della tabella e i dati all'interno della tabella.

È possibile ottimizzare l'intervallo tra le scritture nel modo seguente:

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

Questo codice raccoglie le scritture in batch di 25 record. Il test delle prestazioni suggerisce che le prestazioni migliorano fino a un valore pari a 25. Un WriteDeltaTokenInterval valore maggiore di 25 non migliora significativamente le prestazioni.

Eliminazione

È possibile cancellare il contenuto dell'archivio locale usando IOfflineTable<T>.PurgeItemsAsync. L'eliminazione potrebbe essere necessaria se sono presenti dati non aggiornati nel database client o se si desidera eliminare tutte le modifiche in sospeso. L'operazione di ripulitura cancella una tabella dall'archivio locale. Per eliminare una tabella:

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

Il PurgeItemsAsync() metodo genera un InvalidOperationException errore se sono presenti modifiche in sospeso nella tabella. In questo caso, è possibile forzare l'eliminazione:

await table.PurgeItemsAsync("", new PurgeOptions { DiscardPendingOperations = true });

L'eliminazione è un'ultima risorsa per pulire una tabella nell'archivio offline, perché cancella tutti i record dalla cache e richiede di scaricarli nuovamente.