Synchroniser les données entre L'application Android et le serveur web [fermé]

Je veux synchroniser des données (telles que l'enregistrement db, les 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 une question (imaginez que nous voulons synchroniser les enregistrements DB):

  1. Chaque utilisateur a une partie de l'espace sur le serveur pour lui-même (comme Evernote ou Dropbox). Peut-être que l'utilisateur crée de nouveaux enregistrements par le téléphone portable et crée de nouveaux enregistrements dans le serveur. Comment puis-je faire correspondre ces enregistrements? S'il y a enregistrements avec le même ID quels algorithmes me suggérez-vous?

  2. Sauf JSON, y a-t-il un moyen d'envoyer des données entre le périphérique de téléphone portable et le serveur?

  3. If SyncAdapter et ContentProvider peut résoudre mes problèmes, veuillez expliquer exactement pour moi. (Si vous pouviez m'offrir des échantillons ou des tutoriels ou des conseils ou des mots clés pour aider à élargir / guider ma recherche serait également apprécié).

234
demandé sur jaysoifer 2012-05-31 11:43:48

9 réponses

Je vais essayer de répondre à toutes vos questions en abordant la question plus large: Comment puis-je 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 réellement les données qu'il reçoit du serveur web. Une méthode possible pour y parvenir est d'écrire votre propre coutume ContentProvider 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/

Un ContentProvider définit une interface pour interagir avec vos données stockées. Il pourrait aussi permettre à d'autres applications d'interagir avec vos données si vous le souhaitez. Derrière votre ContentProvider pourrait être une base de données Sqlite, un Cache ou tout stockage arbitraire mécanisme.

Bien que je recommande 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 que vous voulez.

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 penser au type de bibliothèques de sérialisation disponibles. Je sais que de la main gauche qu'il y a 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 aurez besoin d'une sorte de tâche asynchrone qui peut obtenir de nouvelles données de votre serveur et actualiser le contenu mobile pour refléter le contenu du serveur. Vous devez également informer le serveur chaque fois que vous apportez des modifications locales au contenu et que vous souhaitez refléter ces modifications. Android fournit le SyncAdapter motif comme un moyen de résoudre facilement ce motif. Vous devrez enregistrer des comptes d'utilisateurs, puis Android effectuera beaucoup de magie pour vous, 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 les mêmes, 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 faites référence à la même référence. En outre, vous pouvez stocker des attributs de colonne comme "updated_at" pour vous assurer que vous obtenez toujours les données les plus récentes, ou que vous n'écrivez pas accidentellement sur les données nouvellement écrites.

294
répondu Grantismo 2017-09-10 14:28:07

Si nous pensons à aujourd'hui, la réponse acceptée est trop ancienne. Comme nous savons que nous avons beaucoup de nouvelles bibliothèques qui peuvent vous aider à faire ces types d'application.

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

  • SyncAdapter: le composant sync adapter de 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 fournissez dans votre application, la synchronisation adaptateur Framework exécute le code dans le composant adaptateur de synchronisation.

  • RealM : Realm est une base de données mobile: un remplacement pour SQLite & Core Data.

  • Retrofit type-safe HTTP client pour Android et Java par Square, Inc. Doit Apprendre une-puce-moyen-pour-utiliser-rénovation

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

Bonne chance à tous les nouveaux apprenant. :)

47
répondu Pratik Butani 2017-05-23 10:31:36

Si vous écrivez vous-même ces 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 ira généralement en 3 phases, authentification, échange de données, échange d'état (quelles opérations ont fonctionné et lesquelles ont échoué)

Choisissez votre format de charge utile. Je suggère le XML basé sur SyncML mélangé avec le 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 D'un tableau JSON lors de la manipulation des données est toujours préférée car il est facile d'accéder aux données en utilisant un tableau JSON.

Garder une trace des changements de données sur le client et le serveur. Vous pouvez gérer un changelog des ID qui changent et les récupérer pendant une session de synchronisation. Aussi, effacer le changelog que 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 fois de la synchronisation. Il sera utile pour la fin utilisateurs d'identifier le moment où la dernière synchronisation est 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 périphériques

Et le dernier mais non le moins, un moyen de détecter et de gérer les conflits

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

22
répondu openmobster 2014-01-02 11:46:55

@Grantismo fournit une excellente explication sur l'ensemble. Si vous souhaitez savoir qui les gens font réellement ces choses, je vous suggère de jeter un oeil à la façon dont google a fait pour L'application Google IO de 2014 (il vaut toujours la peine de regarder en profondeur le code source de ces applications qu'ils libèrent. Il y a beaucoup à apprendre de là).

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

Essentiellement, sur le côté application: GCM pour la signalisation, Adaptateur de synchronisation pour la récupération de données et parler correctement avec le fournisseur de contenu qui rendra les choses persistantes (oui, il isole la base de données de l'accès direct à partir d'autres parties de l'application).

Aussi, si vous souhaitez jeter un oeil au code de 2015: https://github.com/google/iosched

13
répondu Ciro Costa 2015-05-15 02:51:40

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

(ainsi 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 côté client android

5
répondu Kyle 2017-09-22 08:49:35

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

Tout d'Abord, créez un nom de colonne version (type INT) dans todoTable pour les deux Sqlite et MySql entrez la description de l'image ici

Ensuite, créez un nom de table database_version, avec un nom de colonne currentVersion(INT)
entrez la description de l'image ici

Dans MySql, lorsque vous ajoutez un nouvel élément de todoTable ou élément de mise à jour, vous devez mettre à niveau la version de cet article par +1 et aussi mise à niveau de la currentVersion entrez la description de l'image ici

Dans Android, lorsque vous souhaitez synchroniser (par manuel presse sync bouton ou un service exécuter avec période Temps):

Vous allez envoyer la requête avec Sqlite currentVersion (actuellement c'est 1) au serveur.
Ensuite, dans le serveur, vous trouvez quel élément dans MySql a une valeur de version supérieure à Sqlite currentVersion (1) puis 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 vers todoTable et mettre à niveau la version actuelle

5
répondu Phan Van Linh 2018-03-26 01:18:42

Une façon d'y parvenir pour avoir une application côté serveur qui attend les données. Les données peuvent être envoyées à l'aide d'objets HttpRequest en 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. Tout ce que L'application serveur a à faire est d'attendre que HttpRequests Entre et analyse les données et les stocke où vous voulez.

3
répondu Mayank 2012-05-31 08:49:56

Je suggère d'utiliser un protocole webservice binaire similaire à Hessian . Cela fonctionne très bien et ils ont une implémentation android. Il pourrait être un peu lourd, mais dépend de l'application que vous construisez. Espérons que cette aide.

1
répondu Neo 2012-07-07 00:40:43

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

Syncmanagerandroid bibliothèque fournit une implémentation de synchronisation 2 voies simple à brancher dans le cadre de synchronisation Android (AbstractThreadedSyncAdapter.OnPerformSync).

Https://github.com/sschendel/SyncManagerAndroid

1
répondu Sean 2014-10-26 15:25:41