Synchronisation des données hors connexion dans Azure Mobile AppsOffline Data Sync in Azure Mobile Apps

Qu’est-ce que la synchronisation des données hors connexion ?What is offline data sync?

La synchronisation des données hors connexion est une fonctionnalité du Kit de développement logiciel (SDK) client et serveur d’Azure Mobile Apps qui permet aux développeurs de créer des applications fonctionnant sans connexion réseau.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.

Quand votre application est en mode hors connexion, vous pouvez toujours créer et modifier des données, qui sont enregistrées dans un magasin local.When your app is in offline mode, you can still create and modify data, which are saved to a local store. Quand l’application est de nouveau en ligne, elle peut synchroniser les modifications locales avec le backend d’application Azure Mobile App.When the app is back online, it can synchronize local changes with your Azure Mobile App backend. La fonctionnalité prend également en charge la détection des conflits quand un même enregistrement est modifié sur le client et le backend.The feature also includes support for detecting conflicts when the same record is changed on both the client and the backend. Les conflits peuvent ensuite être traités sur le serveur ou le client.Conflicts can then be handled either on the server or the client.

La synchronisation hors connexion présente plusieurs avantages :Offline sync has several benefits:

  • Améliorer la réactivité de l’application en mettant en cache les données de serveur localement sur l’appareilImprove app responsiveness by caching server data locally on the device
  • Créer des applications robustes qui demeurent opérationnelles en cas de problèmes réseauCreate robust apps that remain useful when there are network issues
  • Permettre aux utilisateurs finaux de créer et de modifier des données même en l’absence d’accès au réseau, prenant ainsi en charge des scénarios avec une connectivité faible ou nulleAllow end users to create and modify data even when there is no network access, supporting scenarios with little or no connectivity
  • Synchroniser des données sur plusieurs appareils et détecter des conflits lorsque le même enregistrement est modifié par deux appareilsSync data across multiple devices and detect conflicts when the same record is modified by two devices
  • Limiter l’utilisation du réseau sur les réseaux à forte latence ou limitésLimit network use on high-latency or metered networks

Les didacticiels suivants montrent comment ajouter la synchronisation hors connexion à vos clients mobiles à l’aide d’Azure Mobile Apps :The following tutorials show how to add offline sync to your mobile clients using Azure Mobile Apps:

Qu’est-ce qu’une table de synchronisation ?What is a sync table?

Pour accéder au point de terminaison « /tables », les Kits de développement logiciel (SDK) client Azure Mobile fournissent des interfaces comme IMobileServiceTable (SDK client .NET) ou 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). Ces API se connectent directement à l’application principale Azure Mobile App et échouent si l’appareil client n’a pas de connexion réseau.These APIs connect directly to the Azure Mobile App backend and fail if the client device does not have a network connection.

Pour prendre en charge l’utilisation hors connexion, votre application doit plutôt utiliser les API de table de synchronisation, comme IMobileServiceSyncTable (SDK client .NET) ou 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). Les mêmes opérations CRUD (Create, Read, Update, Delete) fonctionnent avec les API de table de synchronisation, mais s’exécutent alors par rapport à un magasin local.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. Avant de pouvoir effectuer des opérations de table de synchronisation, le magasin local doit être initialisé.Before any sync table operations can be performed, the local store must be initialized.

Qu’est-ce qu’un magasin local ?What is a local store?

Un magasin local est la couche de persistance des données sur l’appareil client.A local store is the data persistence layer on the client device. Par défaut, les Kits de développement logiciel (SDK) clients Azure Mobile Apps prennent en charge l’implémentation des magasins locaux.The Azure Mobile Apps client SDKs provide a default local store implementation. Dans Windows, Xamarin et Android, cette implémentation est basée sur SQLite.On Windows, Xamarin and Android, it is based on SQLite. Sur iOS, la solution fonctionne sur les données de base.On iOS, it is based on Core Data.

Pour utiliser l’implémentation basée sur SQLite dans Windows Phone ou Microsoft Store, vous devez installer une extension SQLite.To use the SQLite-based implementation on Windows Phone or Microsoft Store, you need to install a SQLite extension. Pour plus d’informations, consultez Plateforme Windows universelle : Activer la synchronisation hors connexion. Le système d’exploitation des appareils Android et iOS comportant une version de SQLite, vous n’avez pas besoin de référencer votre propre version de 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.

Les développeurs peuvent également implémenter leur propre magasin local.Developers can also implement their own local store. Par exemple, si vous souhaitez stocker des données dans un format chiffré sur le client mobile, vous pouvez définir un magasin local qui utilise SQLCipher pour le chiffrement.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.

Qu’est-ce qu’un contexte de synchronisation ?What is a sync context?

Un contexte de synchronisation est associé à un objet client mobile (comme IMobileServiceClient ou MSClient) et effectue le suivi des modifications apportées avec les tables de synchronisation.A sync context is associated with a mobile client object (such as IMobileServiceClient or MSClient) and tracks changes that are made with sync tables. Le contexte de synchronisation gère une file d’attente d’opérations qui conserve une liste ordonnée d’opérations CUD (Create, Update, Delete) destinées à être envoyées au serveur.The sync context maintains an operation queue, which keeps an ordered list of CUD operations (Create, Update, Delete) that is later sent to the server.

Un magasin local est associé au contexte de synchronisation à l’aide d’une méthode d’initialisation comme IMobileServicesSyncContext.InitializeAsync(localstore) dans le Kit de développement logiciel (SDK) client .NET.A local store is associated with the sync context using an initialize method such as IMobileServicesSyncContext.InitializeAsync(localstore) in the .NET client SDK.

Fonctionnement de la synchronisation hors connexionHow offline synchronization works

Quand vous utilisez des tables de synchronisation, votre code client détermine à quel moment les modifications locales sont synchronisées avec une application principale Azure Mobile App.When using sync tables, your client code controls when local changes are synchronized with an Azure Mobile App backend. Rien n’est envoyé au backend tant que n’a pas été émis un appel pour envoyer les modifications locales.Nothing is sent to the backend until there is a call to push local changes. De même, le magasin local n’est rempli avec de nouvelles données que si un appel pour extraire les données est émis.Similarly, the local store is populated with new data only when there is a call to pull data.

  • Push : l’envoi est une opération sur le contexte de synchronisation, qui consiste à envoyer tous les changements CUD survenus depuis le dernier envoi.Push: Push is an operation on the sync context and sends all CUD changes since the last push. Notez qu’il n’est pas possible d’envoyer uniquement les modifications d’une table spécifique, car sinon les opérations pourraient être envoyées dans le désordre.Note that it is not possible to send only an individual table's changes, because otherwise operations could be sent out of order. L’envoi exécute une série d’appels REST à destination de votre application principale Azure Mobile App qui, à son tour, modifie votre base de données serveur.Push executes a series of REST calls to your Azure Mobile App backend, which in turn modifies your server database.

  • Pull : l’extraction est effectuée en fonction de chaque table et peut être personnalisée avec une requête pour récupérer uniquement un sous-ensemble des données du serveur.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. Les Kits de développement logiciel (SDK) clients Azure Mobile insèrent ensuite les données résultantes dans le magasin local.The Azure Mobile client SDKs then insert the resulting data into the local store.

  • Envois implicites : si une extraction est exécutée sur une table en attente de mises à jour locales, cette extraction commence par exécuter un push() sur le contexte de synchronisation.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. Cela opération Push permet de réduire au minimum les conflits entre les modifications qui sont déjà en attente et les nouvelles données du serveur.This push helps minimize conflicts between changes that are already queued and new data from the server.

  • Synchronisation incrémentielle: le premier paramètre de l’opération d’extraction est un nom de requête qui est utilisé uniquement sur le client.Incremental Sync: the first parameter to the pull operation is a query name that is used only on the client. Si vous utilisez un nom de requête non null, le Kit de développement logiciel (SDK) Azure Mobile effectue une synchronisation incrémentielle. Chaque fois qu’une opération d’extraction retourne un jeu de résultats, le dernier horodatage updatedAt à partir de ce jeu de résultats est stocké dans les tables de système locales du Kit de développement logiciel (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. Les opérations d’extraction ultérieures n’extraient que les enregistrements postérieurs à cet horodatage.Subsequent pull operations retrieve only records after that timestamp.

    Pour utiliser la synchronisation incrémentielle, votre serveur doit retourner des valeurs updatedAt explicites et prendre en charge le tri par ce champ.To use incremental sync, your server must return meaningful updatedAt values and must also support sorting by this field. Toutefois, étant donné que le Kit de développement logiciel (SDK) ajoute son propre tri sur le champ updatedAt, vous ne pouvez pas utiliser une requête d’extraction qui a sa propre clause orderBy .However, since the SDK adds its own sort on the updatedAt field, you cannot use a pull query that has its own orderBy clause.

    Le nom de la requête peut être toute chaîne de votre choix, mais il doit être unique pour chaque requête logique dans votre application.The query name can be any string you choose, but it must be unique for each logical query in your app. Sinon, différentes opérations d’extraction pourraient écraser le même horodatage de synchronisation incrémentielle et vos requêtes pourraient renvoyer des résultats incorrects.Otherwise, different pull operations could overwrite the same incremental sync timestamp and your queries can return incorrect results.

    Si la requête possède un paramètre, une façon de créer un nom de requête unique consiste à intégrer la valeur du paramètre.If the query has a parameter, one way to create a unique query name is to incorporate the parameter value. Par exemple, si vous filtrez sur le nom d’utilisateur, le nom de votre requête peut être le suivant (en 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));
    

    Si vous souhaitez désactiver la synchronisation incrémentielle, transmettez null en tant qu'ID de requête.If you want to opt out of incremental sync, pass null as the query ID. Dans ce cas, tous les enregistrements sont extraits à chaque appel à PullAsync, ce qui est potentiellement inefficace.In this case, all records are retrieved on every call to PullAsync, which is potentially inefficient.

  • Vidage : vous pouvez effacer le contenu du magasin local en utilisant IMobileServiceSyncTable.PurgeAsync.Purging: You can clear the contents of the local store using IMobileServiceSyncTable.PurgeAsync. Une purge peut s’avérer nécessaire si la base de données client contient des données obsolètes ou que vous souhaitez ignorer toutes les modifications en attente.Purging may be necessary if you have stale data in the client database, or if you wish to discard all pending changes.

    Une purge efface une table du magasin local.A purge clears a table from the local store. Si des opérations sont en attente de synchronisation avec la base de données du serveur, la purge lève une exception, à moins que le paramètre force purge soit activé.If there are operations awaiting synchronization with the server database, the purge throws an exception unless the force purge parameter is set.

    Pour illustrer les données obsolètes sur le client, supposons que dans l’exemple de la liste de tâches, l’appareil 1 extrait uniquement les éléments qui ne sont pas terminés.As an example of stale data on the client, suppose in the "todo list" example, Device1 only pulls items that are not completed. Un élément de tâche « Acheter du lait » est marqué comme terminé sur le serveur par un autre appareil.A todoitem "Buy milk" is marked completed on the server by another device. Toutefois, l’appareil 1 a toujours l’élément de tâche « Acheter du lait » dans le magasin local, car il extrait uniquement les éléments qui ne sont pas marqués comme terminés.However, Device1 still has the "Buy milk" todoitem in local store because it is only pulling items that are not marked complete. Une purge efface cet élément obsolète.A purge clears this stale item.

Étapes suivantesNext steps