272 votes

Synchronisation des données entre l'application Android et le serveur web

Je souhaite synchroniser des données (telles que des enregistrements de base de données, des médias) 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 quelques questions (imaginons que nous voulions synchroniser les enregistrements de la base de données) :

  1. Chaque utilisateur dispose d'une partie de l'espace serveur (par exemple Evernote o Dropbox ). Il se peut que l'utilisateur crée de nouveaux enregistrements par téléphone portable et crée de nouveaux enregistrements dans le serveur. Comment puis-je faire correspondre ces enregistrements ? S'il y a des enregistrements avec le même ID 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 y Fournisseur de contenu peut résoudre mes problèmes, merci de m'expliquer exactement ce qu'il en est. (Si vous pouvez m'offrir des exemples ou des tutoriels OU Tout conseil ou mot-clé pour aider à élargir/guider ma recherche serait également apprécié).

1 votes

Vous devez d'abord déterminer votre protocole de communication avec le serveur, c'est-à-dire les données que vous pouvez transférer et la manière dont vous pouvez le faire.

0 votes

C'est important pour moi de transférer des données SQLlite, mais j'aimerais savoir comment transférer d'autres données. Je ne comprends pas ce que vous voulez dire à propos du protocole.

0 votes

Par protocole, j'entends ceci simple.wikipedia.org/wiki/Internet_Protocol

315voto

Grantismo Points 1563

Je vais essayer de répondre à toutes vos questions en abordant la question la plus importante : Comment synchroniser les 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 quelques 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. L'une des méthodes possibles pour y parvenir consiste à écrire votre propre fichier Fournisseur de contenu soutenu 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/

A Fournisseur de contenu définit une interface cohérente pour interagir avec les données stockées. Elle pourrait également permettre à d'autres applications d'interagir avec vos données si vous le souhaitiez. Derrière votre Fournisseur de contenu peut être une base de données Sqlite, un cache ou tout autre mécanisme de stockage arbitraire.

Bien que je recommande vivement l'utilisation d'un Fournisseur de contenu avec une base de données Sqlite, vous pourriez 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 actuellement sont XML et JSON. Lorsque vous choisissez votre format, vous devez réfléchir aux bibliothèques de sérialisation disponibles. Je sais par expérience qu'il existe une bibliothèque fantastique pour la sérialisation JSON appelée gson : https://github.com/google/gson mais je suis sûr que des bibliothèques similaires existent pour XML.

Service de synchronisation

Vous aurez besoin d'une sorte de tâche asynchrone qui peut obtenir de nouvelles données de votre serveur et rafraîchir le contenu mobile pour refléter le contenu du serveur. Vous voudrez également notifier le serveur chaque fois que vous apportez des modifications locales au contenu et que vous souhaitez refléter ces modifications. Android fournit la fonction SyncAdapter comme moyen de résoudre facilement ce problème. Vous devrez enregistrer des comptes d'utilisateurs, puis Android effectuera de nombreuses opérations magiques pour vous, et vous permettra de vous 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 créez généralement des éléments avec un identifiant unique que vous stockez à la fois sur l'appareil Android et sur le serveur. Vous pouvez l'utiliser pour vous assurer que vous vous référez à 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 sur des données récemment écrites.

3 votes

Comment synchroniser de grandes quantités de données ?

4 votes

Très bien expliqué, j'ai juste une remarque... SyncAdapter -> "perform lots of magic". J'espère que vous parlez de magie noire... c'est totalement diabolique.

0 votes

@MRodrigues : SyncAdapter peut être de la magie noire pour le développeur mais il fait toujours de la magie pour la stabilité et la fonctionnalité, il est bien meilleur que d'autres librairies.

24voto

openmobster Points 731

Si vous le rédigez vous-même, voici quelques points à garder à l'esprit

Authentification correcte entre l'appareil et le serveur Sync

Protocole de synchronisation entre l'appareil et le serveur. Il se déroule généralement en trois phases : authentification, échange de données, échange d'états (quelles opérations ont fonctionné et lesquelles ont échoué).

Choisissez le format de votre charge utile. Je suggère un format XML basé sur SyncML mélangé à un format basé sur JSON pour représenter les données réelles. Donc SyncML pour le protocole, et JSON pour les données réelles échangées. Il est toujours préférable d'utiliser un tableau JSON pour manipuler les données, car il est facile d'accéder aux données à l'aide d'un tableau JSON.

Suivi des modifications de données sur le client et le serveur. Vous pouvez maintenir un journal des changements d'identifiants et les récupérer lors d'une session de synchronisation. Vous pouvez également effacer le journal des modifications lorsque les objets sont synchronisés avec succès. Vous pouvez également utiliser une variable booléenne pour confirmer l'état de la synchronisation, c'est-à-dire la dernière synchronisation. Cela aidera les utilisateurs finaux à identifier le moment où la dernière synchronisation a été effectuée.

Il est nécessaire de disposer d'un moyen de communication entre le serveur et l'appareil pour lancer 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 plus transparente.

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

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

J'espère que cela constituera un bon point de départ.

6voto

Kyle Points 431

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

(Vous pouvez également opter pour un paquet commercial disponible à l'adresse suivante back4app.com .)

Il s'agit d'un service de base de données côté serveur très simple et convivial qui offre une excellente API Android côté client.

0 votes

Quels sont les plans gratuits proposés ?

12 votes

http://parse.com/ est fermé.

4 votes

Vous pouvez toujours utiliser la fonctionnalité de parse.com, mais sur votre propre serveur, ils ont ouvert la voie.

3voto

Mayank Points 5207

L'une des façons d'y parvenir est d'avoir une application côté serveur qui attend les données. Les données peuvent être envoyées à l'aide de HttpRequest en Java ou vous pouvez écrire vos propres TCP/IP l'utilitaire de transfert de données. Les données peuvent être envoyées en utilisant JSON ou tout autre format que vous jugerez approprié. Les données peuvent également être cryptées avant d'être envoyées au serveur si elles contiennent des informations sensibles. Tout ce que l'application serveur doit faire, c'est attendre que les données soient envoyées au serveur. HttpRequests de venir analyser les données et de les stocker où vous le souhaitez.

0 votes

Comment vérifier les données mises à jour dans l'application locale et sur le serveur ? et comment les fusionner ? Je n'ai pas envie d'envoyer tous les enregistrements par JSON ou autre à l'application pour les fusionner, qu'en pensez-vous ?

2 votes

Vous pourriez utiliser un indicateur, tel que "on server" avec un int/bool 1/0 pour oui ou non. lorsqu'un enregistrement/fichier/bloc de données est envoyé, vérifiez le succès sur le serveur, et faites basculer le bit sur oui. ensuite, si vous utilisez quelque chose comme SQLite, vous pouvez faire un "SELECT * FROM my_table WHERE sent = 0" pour envoyer tous les nouveaux enregistrements.

1voto

macio.Jun Points 1857

Pourquoi ne pas utiliser Google Cloud Messaging ? Voici le lien : http://developer.Android.com/google/gcm/index.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X