Sincronizzazione di dati offline nelle app per dispositivi mobili di AzureOffline Data Sync in Azure Mobile Apps

Che cos'è la sincronizzazione di dati offline?What is offline data sync?

La sincronizzazione di dati offline è una funzionalità dell'SDK client e server delle app per dispositivi mobili di Azure che permette agli sviluppatori di creare con facilità app che possono essere usate anche senza connessione di rete.Offline data sync is a client and server SDK feature of Azure Mobile Apps that makes it easy for developers to create apps that are functional without a network connection.

Quando l'app è in modalità offline, è comunque possibile creare e modificare i dati, che vengono salvati in un archivio locale.When your app is in offline mode, you can still create and modify data, which are saved to a local store. Quando l'app torna online, può sincronizzare le modifiche locali con il back-end dell'app per dispositivi mobili di Azure.When the app is back online, it can synchronize local changes with your Azure Mobile App backend. Questa funzionalità include anche il supporto per il rilevamento di conflitti quando lo stesso record viene modificato nel client e nel back-end.The feature also includes support for detecting conflicts when the same record is changed on both the client and the backend. I conflitti possono essere gestiti sul server o sul client.Conflicts can then be handled either on the server or the client.

La sincronizzazione offline presenta diversi vantaggi:Offline sync has several benefits:

  • Migliorare la velocità di risposta dell'app memorizzando i dati del server nella cache locale del dispositivoImprove app responsiveness by caching server data locally on the device
  • Creare app affidabili che possono essere usate anche in caso di problemi di reteCreate robust apps that remain useful when there are network issues
  • Permettere agli utenti finali di creare e modificare i dati anche in mancanza di accesso alla rete, supportando scenari con connettività scarsa o assenteAllow end users to create and modify data even when there is no network access, supporting scenarios with little or no connectivity
  • Sincronizzare i dati tra più dispositivi e rilevare i conflitti quando lo stesso record viene modificato da due dispositiviSync data across multiple devices and detect conflicts when the same record is modified by two devices
  • Limitare l'uso della rete in reti a latenza elevata o a consumoLimit network use on high-latency or metered networks

Le esercitazioni seguenti illustrano come aggiungere la sincronizzazione offline ai client mobili mediante le app per dispositivi mobili di Azure:The following tutorials show how to add offline sync to your mobile clients using Azure Mobile Apps:

Informazioni sulla tabella di sincronizzazioneWhat is a sync table?

Per accedere all'endpoint "/tables", gli SDK del client mobile di Azure offrono interfacce quali IMobileServiceTable (SDK del client .NET) o MSTable (client iOS).To access the "/tables" endpoint, the Azure Mobile client SDKs provide interfaces such as IMobileServiceTable (.NET client SDK) or MSTable (iOS client). Queste API si connettono direttamente al back-end dell'app per dispositivi mobili di Azure e hanno esito negativo se il dispositivo client non ha una connessione di rete.These APIs connect directly to the Azure Mobile App backend and fail if the client device does not have a network connection.

Per supportare l'uso offline, l'app deve usare invece le API della tabella di sincronizzazione, ad esempio IMobileServiceSyncTable (SDK del client .NET) o MSSyncTable (client iOS).To support offline use, your app should instead use the sync table APIs, such as IMobileServiceSyncTable (.NET client SDK) or MSSyncTable (iOS client). Tutte le operazioni CRUD (Create, Read, Update, Delete) funzionano con le API della tabella di sincronizzazione, ma la lettura o la scrittura vengono effettuate in un archivio locale.All the same CRUD operations (Create, Read, Update, Delete) work against sync table APIs, except now they read from or write to a local store. Prima di poter eseguire qualsiasi operazione sulla tabella di sincronizzazione, è necessario inizializzare l'archivio locale.Before any sync table operations can be performed, the local store must be initialized.

Informazioni sull'archivio localeWhat is a local store?

Un archivio locale è un livello di persistenza dei dati nel dispositivo client.A local store is the data persistence layer on the client device. Gli SDK del client delle app per dispositivi mobili di Azure forniscono un'implementazione predefinita dell'archivio locale.The Azure Mobile Apps client SDKs provide a default local store implementation. In Windows, Xamarin e Android è basato su SQLite,On Windows, Xamarin and Android, it is based on SQLite. mentre in iOS è basato su Core Data.On iOS, it is based on Core Data.

Per usare l'implementazione basata su SQLite in Windows Phone o Windows Store 8.1, è necessario installare un'estensione SQLite.To use the SQLite-based implementation on Windows Phone or Windows Store 8.1, you need to install a SQLite extension. Per altre informazioni, vedere Abilitare la sincronizzazione offline per l'app di Windows. Android e iOS includono una versione di SQLite nel sistema operativo stesso del dispositivo, quindi non è necessario fare riferimento a una versione specifica di SQLite.For more information, see [Universal Windows Platform: Enable offline sync]. Android and iOS ship with a version of SQLite in the device operating system itself, so it is not necessary to reference your own version of SQLite.

Gli sviluppatori possono anche implementare il proprio archivio locale.Developers can also implement their own local store. Ad esempio, per archiviare dati in un formato crittografato nel client mobile, è possibile definire un archivio locale che usa SQLCipher per la crittografia.For instance, if you wish to store data in an encrypted format on the mobile client, you can define a local store that uses SQLCipher for encryption.

Informazioni sul contesto di sincronizzazioneWhat is a sync context?

Un contesto di sincronizzazione è associato a un oggetto client mobile, ad esempio IMobileServiceClient o MSClient, e tiene traccia delle modifiche apportate con le tabelle di sincronizzazione.A sync context is associated with a mobile client object (such as IMobileServiceClient or MSClient) and tracks changes that are made with sync tables. Il contesto di sincronizzazione gestisce una coda operazioni, che include un elenco ordinato di operazioni CUD (Create, Update, Delete) che viene inviato successivamente al server.The sync context maintains an operation queue, which keeps an ordered list of CUD operations (Create, Update, Delete) that is later be sent to the server.

Un archivio locale è associato al contesto di sincronizzazione tramite un metodo di inizializzazione, ad esempio IMobileServicesSyncContext.InitializeAsync(localstore) nel .NET SDK per client.A local store is associated with the sync context using an initialize method such as IMobileServicesSyncContext.InitializeAsync(localstore) in the [.NET client SDK].

Funzionamento della sincronizzazione offlineHow offline synchronization works

Quando si usano le tabelle di sincronizzazione, il codice client controlla quando le modifiche locali vengono sincronizzate con un back-end dell'app per dispositivi mobili di Azure.When using sync tables, your client code controls when local changes are synchronized with an Azure Mobile App backend. I dati vengono inviati al back-end solo quando viene effettuata una chiamata per il push delle modifiche locali.Nothing is sent to the backend until there is a call to push local changes. Analogamente, l'archivio locale viene popolato con nuovi dati solo quando viene effettuata una chiamata per il pull dei dati.Similarly, the local store is populated with new data only when there is a call to pull data.

  • Push: l'operazione push viene effettuata sul contesto di sincronizzazione e invia tutte le modifiche CUD apportate dopo l'ultimo push.Push: Push is an operation on the sync context and sends all CUD changes since the last push. Si noti che non è possibile inviare solo le modifiche di una singola tabella, perché ciò potrebbe alterare l'ordine di invio delle operazioni.Note that it is not possible to send only an individual table's changes, because otherwise operations could be sent out of order. L'operazione push esegue una serie di chiamate REST al back-end dell'app per dispositivi mobili di Azure, che a sua volta modifica il database del server.Push executes a series of REST calls to your Azure Mobile App backend, which in turn modifies your server database.
  • Pull: l'operazione pull viene effettuata per ogni singola tabella e può essere personalizzata con una query, in modo da recuperare solo un subset dei dati del server.Pull: Pull is performed on a per-table basis and can be customized with a query to retrieve only a subset of the server data. Gli SDK del client mobile di Azure inseriscono quindi i dati risultanti nell'archivio locale.The Azure Mobile client SDKs then insert the resulting data into the local store.
  • Push impliciti: se un'operazione pull viene eseguita in una tabella con aggiornamenti locali in sospeso, il pull esegue prima un'operazione push() sul contesto di sincronizzazione.Implicit Pushes: If a pull is executed against a table that has pending local updates, the pull first executes a push() on the sync context. Questo push consente di ridurre al minimo i conflitti tra le modifiche già in coda e i nuovi dati dal server.This push helps minimize conflicts between changes that are already queued and new data from the server.
  • Sincronizzazione incrementale: il primo parametro dell'operazione pull è un nome query usato solo nel client.Incremental Sync: the first parameter to the pull operation is a query name that is used only on the client. Se si usa un nome di query non Null, Azure Mobile SDK esegue una sincronizzazione incrementale. Ogni volta che un'operazione pull restituisce un set di risultati, il timestamp updatedAt più recente di tale set di risultati viene archiviato nelle tabelle di sistema locali dell'SDK.If you use a non-null query name, the Azure Mobile SDK performs an incremental sync. Each time a pull operation returns a set of results, the latest updatedAt timestamp from that result set is stored in the SDK local system tables. Le operazioni pull successive recuperano solo i record successivi a tale timestamp.Subsequent pull operations retrieve only records after that timestamp.

    Per usare la sincronizzazione incrementale, il server deve restituire valori updatedAt significativi e deve anche supportare l'ordinamento in base a questo campo.To use incremental sync, your server must return meaningful updatedAt values and must also support sorting by this field. Poiché tuttavia l'SDK aggiunge il proprio ordinamento al campo updatedAt, non è possibile usare una query pull con una clausola orderBy specifica.However, since the SDK adds its own sort on the updatedAt field, you cannot use a pull query that has its own orderBy clause.

    Il nome della query può essere una stringa qualsiasi, ma deve essere univoco per ogni query logica dell'app.The query name can be any string you choose, but it must be unique for each logical query in your app. In caso contrario, diverse operazioni pull potrebbero sovrascrivere lo stesso timestamp di sincronizzazione incrementale e le query potrebbero restituire risultati non corretti.Otherwise, different pull operations could overwrite the same incremental sync timestamp and your queries can return incorrect results.

    Se la query ha un parametro, è possibile creare un nome di query univoco incorporando il valore del parametro.If the query has a parameter, one way to create a unique query name is to incorporate the parameter value. Ad esempio, se si applica un filtro in base all'ID utente, il nome della query potrebbe essere analogo al seguente (in C#):For instance, if you are filtering on userid, your query name could be as follows (in C#):

      await todoTable.PullAsync("todoItems" + userid,
          syncTable.Where(u => u.UserId == userid));
    

    Se si intende rifiutare esplicitamente la sincronizzazione incrementale, passare null come ID di query.If you want to opt out of incremental sync, pass null as the query ID. In questo caso, vengono recuperati tutti i record in ogni chiamata a PullAsync, potenzialmente inefficace.In this case, all records are retrieved on every call to PullAsync, which is potentially inefficient.

  • Eliminazione: è possibile eliminare i contenuti dell'archivio locale usando IMobileServiceSyncTable.PurgeAsync.Purging: You can clear the contents of the local store using IMobileServiceSyncTable.PurgeAsync. La ripulitura potrebbe essere necessaria se il database client include dati non aggiornati o se si vogliono eliminare tutte le modifiche in sospeso.Purging may be necessary if you have stale data in the client database, or if you wish to discard all pending changes.

    L'operazione di ripulitura cancella una tabella dall'archivio locale.A purge clears a table from the local store. Se sono presenti operazioni in attesa di sincronizzazione con il database del server, la ripulitura genera un'eccezione, a meno che non sia impostato il parametro force purge.If there are operations awaiting synchronization with the server database, the purge throws an exception unless the force purge parameter is set.

    Come esempio di dati non aggiornati sul client, si supponga che Device1 nell'esempio "todo list" esegua il pull solo di elementi non completati.As an example of stale data on the client, suppose in the "todo list" example, Device1 only pulls items that are not completed. Un elemento todoitem "Buy milk" viene contrassegnato come completato nel server da un altro dispositivo.A todoitem "Buy milk" is marked completed on the server by another device. Device1 include ancora tuttavia l'elemento todoitem "Buy milk" nell'archivio locale, perché esegue il pull solo degli elementi non contrassegnati come completi.However, Device1 still has the "Buy milk" todoitem in local store because it is only pulling items that are not marked complete. Questo elemento non aggiornato viene cancellato da un'operazione di ripulitura.A purge clears this stale item.

Passaggi successiviNext steps