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 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):
Chaque utilisateur dispose d'une partie de l'espace serveur pour lui-même (comme
Evernote
ouDropbox
). 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?Excepté JSON , existe-t-il un moyen d'envoyer des données entre le téléphone portable et le serveur?
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).
la source
Réponses:
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.
la source
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. :)
la source
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.
la source
@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
la source
Par exemple, vous souhaitez synchroniser la table
todoTable
deMySql
àSqlite
Tout d' abord, créer un nom de colonne
version (type INT)
danstodoTable
pour les deuxSqlite
etMySql
Deuxièmement, créez un nom de table
database_version
avec un nom de colonnecurrentVersion(INT)
Dans
MySql
, lorsque vous ajoutez un nouvel élémenttodoTable
ou mettez à jour un élément, vous devez mettre à niveau la version de cet élément de +1 et également mettre à niveau lecurrentVersion
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
Sqlite
version actuelle (actuellement 1) au serveur.Ensuite, dans le serveur, vous trouvez quel élément
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émenttodoTable
et mettre à niveau la version actuellela source
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
la source
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'
HttpRequest
objets en Java ou vous pouvez écrire votre propreTCP/IP
utilitaire de transfert de données. Les données peuvent être envoyées en utilisant unJSON
format 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'attendreHttpRequests
d'entrer et d'analyser les données et de les stocker où vous le souhaitez.la source
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.
la source
@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
la source