web-dev-qa-db-fra.com

Synchroniser les données entre Android App et le serveur Web

Je souhaite synchroniser des données (telles que l'enregistrement de la base de données, le support) entre une application Android et un serveur. Si vous avez vu Evernote ou des applications similaires, vous comprenez certainement ce que je veux dire.

J'ai une question (imaginons que nous voulions synchroniser des enregistrements de base de données):

  1. Chaque utilisateur dispose d’une partie de l’espace serveur (tel que Evernote ou Dropbox). Peut-être que l'utilisateur crée de nouveaux enregistrements par téléphone portable et crée de nouveaux enregistrements sur le serveur. Comment puis-je faire correspondre ces enregistrements ensemble? S'il existe des enregistrements avec le même identifiant Quels algorithmes me suggérez-vous?

  2. Sauf JSON, Existe-t-il un moyen d'envoyer des données entre le téléphone portable et le serveur?

  3. Si SyncAdapter et ContentProvider peuvent résoudre mes problèmes, veuillez m'expliquer exactement . (Si vous pouviez me proposer des exemples ou des tutoriels, OR Tout conseil ou mot clé susceptible d’aider à élargir/guider ma recherche serait également apprécié).

251
Omid Nazifi

Je vais essayer de répondre à toutes vos questions en répondant à la question plus large: Comment synchroniser des données entre un serveur Web et une application Android?


La synchronisation des données entre votre serveur Web et une application Android nécessite deux composants différents sur votre appareil Android.

Stockage persistant:

C’est ainsi que votre téléphone stocke les données qu’il reçoit du serveur Web. Une méthode possible pour y parvenir consiste à écrire votre propre contenu ContentProvider sauvegardé par une base de données SQLite. Un tutoriel décent pour un fournisseur de contenu peut être trouvé ici: http://thinkandroid.wordpress.com/2010/01/13/writing-your-own-contentprovider/

Un ContentProvider définit une interface cohérente pour interagir avec vos données stockées. Cela pourrait également permettre à d'autres applications d'interagir avec vos données si vous le souhaitez. Derrière votre ContentProvider pourrait se trouver une base de données SQLite, un cache ou tout autre mécanisme de stockage arbitraire.

Bien que je recommanderais certainement d’utiliser un ContentProvider avec une base de données SQLite, vous pouvez utiliser n’importe quel mécanisme de stockage basé sur Java.

Format d'échange de données:

C'est le format que vous utilisez pour envoyer les données entre votre serveur Web et votre application Android. Les deux formats les plus populaires de nos jours sont XML et JSON. Lorsque vous choisissez votre format, vous devriez réfléchir au type de bibliothèques de sérialisation disponibles. Je sais qu'il existe une bibliothèque fantastique pour la sérialisation JSON appelée gson: https://github.com/google/gson , bien que je sois sûr que des bibliothèques similaires existent pour XML.

Service de synchronisation

Vous voudrez une sorte de tâche asynchrone pouvant extraire de nouvelles données de votre serveur et actualiser le contenu mobile pour refléter le contenu du serveur. Vous voudrez également informer le serveur lorsque vous apportez des modifications locales au contenu et que vous souhaitez refléter ces modifications. Android fournit le modèle SyncAdapter comme moyen de résoudre facilement ce modèle. Vous aurez besoin d’enregistrer des comptes d’utilisateur, puis Android vous offrira beaucoup de magie et vous permettra de synchroniser automatiquement. Voici un bon tutoriel: http://www.c99.org/2010/01/23/writing-an-Android-sync-provider-part-1/


En ce qui concerne la façon dont vous identifiez si les enregistrements sont identiques, vous allez généralement créer des éléments avec un identifiant unique que vous stockerez à la fois sur le périphérique Android et sur le serveur. Vous pouvez l'utiliser pour vous assurer de faire référence à la même référence. En outre, vous pouvez stocker des attributs de colonne tels que "updated_at" pour vous assurer que vous obtenez toujours les données les plus récentes, ou que vous n'écrivez pas accidentellement par-dessus des données nouvellement écrites.

307
Grantismo

Si on pense à aujourd'hui , réponse acceptée est trop vieux. Comme nous savons que nous avons beaucoup de nouvelles bibliothèques qui peuvent vous aider à faire ce type d’application.

Vous devriez apprendre les sujets suivants qui vous aideront sûrement:

  • SyncAdapter: Le composant adaptateur de synchronisation dans votre application encapsule le code des tâches qui transfèrent des données entre le périphérique et un serveur. En fonction de la planification et des déclencheurs que vous indiquez dans votre application, l'infrastructure de l'adaptateur de synchronisation exécute le code dans le composant de l'adaptateur de synchronisation.

  • Realm : Realm est une base de données mobile: remplace SQLite & Core Data.

  • Retrofit Client HTTP de type sécurisé pour Android et Java de Square, Inc. Doit savoir n moyen intelligent d'utiliser) rénovation

Et votre logique de synchronisation pour la base de données comme: Comment synchroniser la base de données SQLite sur Android téléphone avec la base de données MySQL sur le serveur?

Bonne chance à tous les nouveaux apprenants. :)

57

Si vous écrivez cela vous-même, voici quelques points à garder à l’esprit

Authentification correcte entre le périphérique et le serveur de synchronisation

Un protocole de synchronisation entre le périphérique et le serveur. Il y aura généralement 3 phases: authentification, échange de données, échange de statut (quelles opérations ont fonctionné et lesquelles ont échoué)

Choisissez votre format de charge utile. Je suggère un XML basé sur SyncML associé à un format basé sur JSON pour représenter les données réelles. Donc, SyncML pour le protocole et JSON pour les données échangées. L'utilisation du tableau JSON lors de la manipulation des données est toujours préférable car il est facile d'accéder aux données à l'aide du tableau JSON.

Garder une trace des modifications de données sur le client et le serveur. Vous pouvez gérer un changelog d'identifiants qui changent et les récupérer pendant une session de synchronisation. En outre, effacez le journal des modifications car les objets sont correctement synchronisés. Vous pouvez également utiliser une variable booléenne pour confirmer l’état de la synchronisation, c’est-à-dire la dernière heure de synchronisation. Il sera utile pour les utilisateurs finaux d'identifier l'heure à laquelle la dernière synchronisation a été effectuée.

Besoin d'un moyen de communiquer du serveur au périphérique pour démarrer une session de synchronisation lorsque les données changent sur le serveur. Vous pouvez utiliser C2DM ou écrire votre propre communication persistante basée sur TCP. L'approche TCP est beaucoup transparente

Un moyen de répliquer les modifications de données sur plusieurs appareils

Enfin et surtout, un moyen de détecter et de gérer les conflits

J'espère que cela vous aidera comme point de départ.

24
openmobster

@Grantismo fournit une excellente explication sur l'ensemble. Si vous souhaitez savoir qui fait réellement cela, je vous suggère de jeter un coup d'œil à la façon dont Google l'a fait pour l'application Google IO de 2014 (il vaut toujours la peine de jeter un regard approfondi sur le code source de ces applications. applications qu’ils libèrent. Il y a beaucoup à apprendre de là).

Voici un article de blog à ce sujet: http://Android-developers.blogspot.com.br/2014/09/conference-data-sync-gcm-google-io.html

Pour l’essentiel, côté application: GCM pour la signalisation, Sync Adapter pour récupérer les données et dialoguer correctement avec le fournisseur de contenu qui rendra les choses persistantes (ouais, cela isole la base de données de tout accès direct aux autres parties de l’application).

De plus, si vous souhaitez consulter le code de 2015: https://github.com/google/iosched

14
Ciro Costa

Par exemple, vous souhaitez synchroniser la table todoTable de MySql à Sqlite

Commencez par créer un nom de colonne version (type INT) dans todoTable pour Sqlite et MySqlenter image description here

Deuxièmement, créez un nom de table database_version avec un nom de colonne currentVersion(INT)
enter image description here

Dans MySql, lorsque vous ajoutez un nouvel élément à todoTable ou mettez à jour un élément, vous devez mettre à niveau la version de cet élément de +1 et également améliore la currentVersionenter image description here

Dans Android, lorsque vous souhaitez synchroniser (par une pression manuelle sur le bouton de synchronisation ou un service exécuté avec une période de temps):

Vous allez envoyer la demande avec la Sqlite currentVersion (actuellement 1) au serveur.
Ensuite, dans le serveur, vous trouvez quel élément de MySql a une valeur de version supérieure à Sqlite currentVersion (1), puis une réponse à Android (dans cet exemple, l'élément 3 avec la version 2 répondra à Android)

Dans SQLite, vous allez ajouter ou mettre à jour un nouvel élément dans todoTable et mettre à jour la currentVersion.

7
Phan Van Linh

Regardez parseplatform.org . c'est un projet opensource.

(Aussi bien que vous pouvez aller pour le paquet commercial disponible à back4app.com .)

C'est un service de base de données côté serveur très simple et convivial, qui donne une excellente API Android côté client

6
Kyle

une façon d'y parvenir consiste à avoir une application côté serveur qui attend les données. Les données peuvent être envoyées à l'aide d'objets HttpRequest dans Java ou vous pouvez écrire votre propre utilitaire de transfert de données TCP/IP. Les données peuvent être envoyées en utilisant le format JSON ou tout autre format que vous jugez approprié. Les données peuvent également être cryptées avant d'être envoyées au serveur si elles contiennent des informations sensibles. Toute application serveur doit simplement attendre que HttpRequests entre, analyse les données et les stocke où vous le souhaitez.

3
Mayank

@Grantismo donne un bon aperçu des Android composants de synchronisation.

La bibliothèque SyncManagerAndroid fournit une implémentation simple de synchronisation bidirectionnelle à connecter au cadre de synchronisation Android Sync (AbstractThreadedSyncAdapter.OnPerformSync).

https://github.com/sschendel/SyncManagerAndroid

1
Sean

Je suggère d'utiliser un protocole de service Web binaire semblable à Hessian . Cela fonctionne très bien et ils ont une implémentation Android. Cela peut paraître un peu lourd, mais cela dépend de l’application que vous construisez. J'espère que cela t'aides.

1
Neo