Synchroniser les données entre l'application Android et le serveur Web [fermé]

262

Je souhaite synchroniser les données (telles que l'enregistrement db, les médias) entre une application Android et un serveur. Si vous avez vu Evernoteou 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 dispose d'une partie de l'espace serveur pour lui-même (comme Evernoteou 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 ID Quels algorithmes me proposez-vous?

  2. Excepté 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 expliquer exactement pour moi. (Si vous pouviez me proposer des exemples ou des tutoriels OU Des conseils ou des mots clés pour élargir / guider ma recherche seraient également appréciés).

Omid Nazifi
la source
1
Vous devez d'abord déterminer (décider) votre protocole de communication avec le serveur - d'où - quelles données vous pouvez transférer et comment.
hovanessyan
C'est important pour moi, transférer des données SQLlite. mais je saurais comment transférer d'autres données. Je ne comprends pas votre méchanceté au sujet du protocole. veuillez expliquer plus.
Omid Nazifi
Par protocole, je veux dire ce simple.wikipedia.org/wiki/Internet_Protocol
hovanessyan
1
essayez konysync, un produit de konylabs qui fournit des solutions de bout en bout sur diverses plateformes (android, windows, ios), serveurs web, fournisseurs de données (salesforce, fournisseurs sap), bases de données (sqlserver, mysql ...)
saimadan

Réponses:

311

J'essaierai de répondre à toutes vos questions en répondant à la question plus large: comment puis-je 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 réellement les données qu'il reçoit du serveur Web. Une méthode possible pour y parvenir consiste à écrire votre propre ContentProvider personnalisé 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 cohérente pour interagir avec vos données stockées. Il pourrait également permettre à d'autres applications d'interagir avec vos données si vous le souhaitez. Derrière votre ContentProvider peut se trouver une base de données Sqlite, un cache ou tout 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 que vous souhaitez.

Format d'échange de données:

Il s'agit du 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 devez penser au type de bibliothèques de sérialisation disponibles. Je sais d'emblée qu'il existe une bibliothèque fantastique pour la sérialisation json appelée gson: https://github.com/google/gson , bien que 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 actualiser le contenu mobile pour refléter le contenu du serveur. Vous souhaiterez également informer le serveur chaque fois que vous apportez des modifications locales au contenu et souhaitez refléter ces modifications. Android fournit le modèle SyncAdapter comme un moyen de résoudre facilement ce modèle. 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/


Quant à la façon dont vous identifiez si les enregistrements sont les mêmes, vous créerez généralement des éléments avec un identifiant unique que vous stockerez à 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. De plus, 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 des données nouvellement écrites.

Grantismo
la source
3
Qu'en est-il d'une grande quantité de données? comment synchroniser?
Pratik Butani
4
Très bien expliqué j'ai juste une note ... SyncAdapter -> "effectuer beaucoup de magie". J'espère que vous le référez à la magie noire ... c'est totalement diabolique.
MRodrigues
@MRodrigues: SyncAdapter pourrait être de la magie noire pour le développeur, mais il fait toujours de la magie pour la stabilité et la fonctionnalité, il est beaucoup mieux que d'autres bibliothèques
Milad Metias
2
De quoi le service Web lui-même a-t-il besoin pour le synchroniser avec un appareil Android? Est-ce possible avec Spring?
jublikon
58

Si nous pensons à aujourd'hui , la réponse acceptée est trop ancienne. Comme nous savons que nous avons de nombreuses nouvelles bibliothèques qui peuvent vous aider à créer ce type d'application.

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

  • SyncAdapter: le composant adaptateur de synchronisation de votre application encapsule le code des tâches qui transfèrent des données entre l'appareil et un serveur. En fonction de la planification et des déclencheurs que vous fournissez dans votre application, la structure de l'adaptateur de synchronisation 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 Client HTTP de type sécurisé pour Android et Java par Square, Inc. Doit apprendre une mise à niveau intelligente

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 apprenants. :)

Pratik Butani
la source
Le lien vers une mise à niveau intelligente est mort
Greg Holst
@GregHolst mis à jour.
Pratik Butani
3
Toujours en panne. Ou nécessite une connexion? Archive.org l'a: web.archive.org/web/20160316222227/https://futurestud.io/blog/…
bobpaul
24

Si vous écrivez vous-même ce sont quelques-uns des points à garder à l'esprit

Authentification appropriée entre l'appareil et le serveur de synchronisation

Un protocole de synchronisation entre l'appareil et le serveur. Il se déroulera 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 XML basé sur SyncML mélangé avec 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. L'utilisation de JSON Array lors de la manipulation des données est toujours préférable car il est facile d'accéder aux données à l'aide de JSON Array.

Garder une trace des modifications des données sur le client et le serveur. Vous pouvez conserver un journal des modifications des 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 synchronisation, c'est-à-dire la dernière fois de synchronisation. Il sera utile pour les utilisateurs finaux d'identifier l'heure de la dernière synchronisation.

Vous devez avoir 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 basée sur TCP persistante. L'approche TCP est beaucoup transparente

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

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

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

openmobster
la source
14

@Grantismo fournit une excellente explication sur l'ensemble. Si vous souhaitez savoir qui fait réellement ces choses, je vous suggère de jeter un œil à la façon dont Google a fait pour l'application Google IO de 2014 (cela vaut toujours la peine de jeter un coup d'œil au code source de ces applications qu'ils publient. 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

Essentiellement, du côté de l'application: GCM pour la signalisation, adaptateur de synchronisation pour la récupération des données et la conversation correcte avec Content Provider, ce qui rendra les choses persistantes (oui, cela isole la base de données de l'accès direct aux autres parties de l'application).

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

Ciro Costa
la source
Le code source de l'application Google IO est assez utile IMO!
Richeek
10

Par exemple, vous souhaitez synchroniser la table todoTablede MySqlàSqlite

Tout d' abord, créer un nom de colonne version (type INT)dans todoTablepour les deux SqliteetMySql entrez la description de l'image ici

Deuxièmement, créez un nom de table database_versionavec un nom de colonnecurrentVersion(INT)
entrez la description de l'image ici

Dans MySql, lorsque vous ajoutez un nouvel élément todoTableou mettez à jour un élément, vous devez mettre à niveau la version de cet élément de +1 et également mettre à niveau lecurrentVersion entrez la description de l'image ici

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

Vous enverrez la demande avec la Sqliteversion actuelle (actuellement 1) au serveur.
Ensuite, dans le serveur, vous trouvez quel élément MySqla une valeur de version supérieure à SqlitecurrentVersion (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 todoTableet mettre à niveau la version actuelle

Phan Van Linh
la source
1
Votre idée est brillante mais ne comprend toujours pas la conception de la table correctement. Avec des services de repos et un service de synchronisation approprié, cela fonctionne
Ahesanali Suthar
6

Regardez parseplatform.org . c'est un projet open source.

(Vous pouvez également opter pour un package commercial disponible sur 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 côté client Android

Kyle
la source
Quels sont les plans gratuits que l'offre?
Prakhar Mohan Srivastava
12
http://parse.com/ est fermé.
Chintan Rathod
4
vous pouvez toujours utiliser la fonctionnalité parse.com, mais sur votre propre serveur, ils ont
ouvert leurs ressources
3

une façon d'y parvenir d'avoir une application côté serveur qui attend les données. Les données peuvent être envoyées à l'aide d' HttpRequestobjets en Java ou vous pouvez écrire votre propre TCP/IPutilitaire de transfert de données. Les données peuvent être envoyées en utilisant un JSONformat ou tout autre format que vous jugez approprié. Les données peuvent également être chiffré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 HttpRequestsd'entrer et d'analyser les données et de les stocker où vous le souhaitez.

Mayank
la source
Comment vérifier les données mises à jour dans l'application et le serveur locaux? et comment fusionner ensemble? Ce n'est pas bon que j'envoie tous les enregistrements par JSON ou quoi que ce soit à une demande de fusion. Qu'est-ce que tu penses?
Omid Nazifi
2
vous pouvez utiliser un indicateur, tel que "sur le serveur" 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 basculez le bit sur oui. alors si vous utilisez quelque chose comme SQLite, vous pouvez faire une chose de type "SELECT * FROM my_table WHERE sent = 0" pour envoyer de nouveaux enregistrements
Evan R.
1

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

Néo
la source
1

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

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

https://github.com/sschendel/SyncManagerAndroid

Sean
la source