Synchronisation des données hors connexion

La synchronisation des données hors connexion est une fonctionnalité du kit SDK d’Azure Mobile Apps. Les données sont stockées dans un magasin local. Lorsque votre application est hors connexion, vous pouvez toujours créer, modifier et rechercher les données. Les données sont synchronisées avec votre service Azure Mobile Apps lorsque votre appareil est en ligne. Le Kit de développement logiciel (SDK) prend en charge la résolution des conflits lorsque le même enregistrement est modifié sur le client et le service.

La synchronisation hors connexion présente plusieurs avantages :

  • Améliore la réactivité des applications
  • Améliore la fiabilité des applications en cas de mauvaise connectivité réseau
  • Limite l’utilisation du réseau sur les réseaux à latence élevée ou limitée
  • Prend en charge l’utilisation déconnectée

Les didacticiels suivants montrent comment ajouter une synchronisation hors connexion à vos clients mobiles à l’aide d’Azure Mobile Apps :

Qu’est-ce qu’une table de synchronisation ?

Les kits SDK Azure Mobile Apps fournissent IRemoteTable<T>, qui accèdent directement au service. L’opération échoue si l’appareil n’a pas de connexion réseau. Une table de synchronisation (fournie par IOfflineTable<T>) fournit les mêmes opérations sur un magasin local. Le magasin local peut ensuite être synchronisé avec le service ultérieurement. Avant d’effectuer des opérations, vous devez initialiser le magasin local.

Qu’est-ce qu’un magasin local ?

Un magasin local est la couche de persistance des données sur l’appareil client. La plupart des plateformes utilisent SQLite pour le magasin local, mais iOS utilise les données de base. Vous pouvez également implémenter votre propre magasin local. Par exemple, utilisez une version de SQLite avec SQLCipher pour produire un magasin chiffré.

Comment fonctionne la synchronisation hors connexion ?

Votre code client contrôle quand les modifications locales sont synchronisées avec un service de synchronisation de données. Rien n’est envoyé au service tant que vous n’avez pas envoyé les modifications locales. De même, le magasin local est rempli avec des données nouvelles ou mises à jour uniquement lorsque vous extrayez des données.

Vous pouvez envoyer (push) des opérations en attente pour toutes les tables, une liste de tables ou une table :

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

Synchronisation

L’opération push envoie toutes les modifications en attente dans la file d’attente des opérations au service. La modification en attente est envoyée au service via un appel REST HTTP, qui modifie à son tour votre base de données.

Les opérations push sont effectuées avant toute opération pull. L’opération pull extrait les données modifiées du service et les stocke dans le magasin local.

Push implicite

Si vous exécutez une extraction sur une table qui a des mises à jour locales en attente, l’extraction exécute d’abord un push pour cette table. 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. Vous pouvez éventuellement configurer un push de toutes les tables en définissant PushOtherTables :PullOptions

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

Extraction d’un sous-ensemble d’enregistrements

Vous pouvez éventuellement spécifier une requête utilisée pour déterminer quels enregistrements doivent être inclus dans la base de données hors connexion. Par exemple :

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

Synchronisation incrémentielle

Azure Mobile Apps implémente la synchronisation incrémentielle. Seuls les enregistrements qui ont changé depuis la dernière opération de tirage sont extraits. La synchronisation incrémentielle permet de gagner du temps et de la bande passante lorsque vous traitez des tables volumineuses.

Pour chaque requête unique, le UpdatedAt champ du dernier enregistrement transféré avec succès est stocké en tant que jeton dans le magasin hors connexion. La dernière UpdatedAt valeur est stockée dans le magasin de jetons delta. Le magasin de jetons delta est implémenté en tant que table dans le magasin hors connexion.

Performances et cohérence

La synchronisation s’arrête parfois prématurément. Par exemple :

  • Le réseau que vous utilisez pour la synchronisation devient indisponible pendant le processus de synchronisation.
  • Vous forcez à fermer l’application pendant la synchronisation.

Pour réduire le risque d’un problème de cohérence au sein de la base de données hors connexion, chaque enregistrement est écrit dans la base de données au fur et à mesure qu’il est reçu. Vous pouvez, si vous le souhaitez, décider d’écrire les enregistrements dans la base de données par lots. Les opérations par lots augmentent les performances des écritures de base de données hors connexion pendant l’opération d’extraction. Toutefois, ils augmentent également le risque d’incohérence entre les métadonnées de la table et les données de la table.

Vous pouvez régler l’intervalle entre les écritures comme suit :

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

Ce code rassemble les écritures dans des lots de 25 enregistrements. Les tests de performances suggèrent que les performances s’améliorent jusqu’à une valeur de 25. Une WriteDeltaTokenInterval valeur supérieure à 25 n’améliore pas considérablement les performances.

Purge

Vous pouvez effacer le contenu du magasin local à l’aide IOfflineTable<T>.PurgeItemsAsyncde . Le purge peut être nécessaire si vous avez des données obsolètes dans la base de données cliente, ou si vous souhaitez dissomper carte toutes les modifications en attente. Une purge efface une table du magasin local. Pour vider une table :

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

La PurgeItemsAsync() méthode lève une InvalidOperationException erreur s’il existe des modifications en attente dans la table. Dans ce cas, vous pouvez forcer le vidage à se produire :

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

Purger est un dernier recours pour propre la mise en place d’une table dans le magasin hors connexion, car elle efface tous les enregistrements du cache et vous oblige à les télécharger à nouveau.