150 votes

Meilleure façon de synchroniser la base de données HTML5 locale (WebSQL Storage, SQLite) avec un serveur (synchronisation bidirectionnelle)

Je développe une application web mobile (pour iPhone et Android) avec une base de données locale (à l'aide de html5 webstorage) donc mon application est utilisable lorsque l'utilisateur est hors-ligne.

Cela fonctionne parfaitement, mais je veux enregistrer les données sur un serveur. J'ai donc besoin de synchroniser l'DB avec une base de données sur un serveur. La synchronisation peut être la seule façon, mais dans l'avenir, je tiens à le synchroniser à la fois moyen (serveur <-> DB).

Cette requierement semble très commun (ou qui le seront à l'avenir pour l'application web mobile), mais je ne peux pas trouver une bibliothèque à faire.

Je sais que google est en train de faire que dans leur application web mobile (ex. gmail), et j'ai trouvé le WSPL projet un projet google mais sans source à télécharger.

Si je ne peux pas trouver une solution, je vais créer une bibliothèque pour le faire, comme un moyen de synchronisation n'a pas l'air difficile, mais je me demande si il y a d'autres solutions.

71voto

Samuel Points 2645
  • J'ai créé un petit JS lib nommé WebSqlSync pour synchroniser un local WebSql DB avec un serveur (client <-> serveur). Très facile à utiliser et à intégrer dans votre code :

https://github.com/orbitaloop/WebSqlSync

  • Le projet open source QuickConnect contient une bibliothèque JS pour synchroniser l'HTML5 SQLite DB à un serveur DB (MySQL ou autre) :

http://quickconnect.pbworks.com/Using-Enterprise-Synchronization

Pour utiliser cette lib, vous devez utiliser le DataAccessObject le cadre de l'accès à votre base de données. Il fonctionne en stockant toutes les requête SQL appliquée à la DB (sauf certains bien sûr) , et de les envoyer au serveur. C'est génial pour gérer la suppression, mais c'est un peu lourd si vous avez beaucoup de mises à jour, et le serveur doivent utiliser le même langage SQL...

  • Un autre projet de QuickConnect est un natif SQLite de synchronisation (en Objective-C pour iOS ou Mac OS et en Java pour Android) :

http://www.quickconnectfamily.org/qcdbsync/ (Je pense que ce magasin a aussi l'histoire de toutes les requêtes SQL)

  • Et je viens de trouver un autre prometteurs bibliothèque JS : persistenceJS

https://github.com/zefhemel/persistencejs

"persistence.js est un asynchronous Javascript object-relational mapper de la bibliothèque. Vous pouvez l'utiliser dans le navigateur, aussi bien sur le serveur (et vous pouvez partager des modèles de données entre eux)".

Ils ont une base de données de synchronisation du module: DOC de persistence.synch.js

(fonctionne avec HTML5 DB SQLite ou Google Gears sur le client, et MySQL sur le serveur)

  • Et il y a aussi Impel.inTouch. Il a l'air très facile à utiliser (avec les fichiers php inclus), mais vous devez utiliser le framework Mootools dans le côté client :

http://impel.simulacre.org/api/Impel.inTouch

  • Sencha a également un service de synchronisation: Sencha.io. Ressemble beaucoup, mais il est dépendant de la Sencha Touch cadre:

http://www.sencha.com/products/io/

18voto

Samuel Points 2645

J'ai développé un générique solution de synchronisation appelé WebSqlSync.

Il n'est pas dépendant d'aucun schéma. Il est disponible ici : https://github.com/orbitaloop/WebSqlSync

Extrait du fichier README :

WebSqlSync

Synchroniser automatiquement un local WebSql base de données (SQLite dans le navigateur à un serveur. (2 façon de synchronisation : client <-> serveur)

Très facile à intégrer à votre application existante et très facile à utiliser (2 fonctions d'appel : initSync et syncNow)

L'utilisation de la

Initialiser

Vous devez initialiser la lib (à chaque démarrage par exemple).

Il va automatiquement créer 2 tables (si ils ne sont pas déjà présent, pour stocker tous les éléments nouveaux ou modifiés (tableau new_elem) et de stocker la date de la dernière synchronisation (tableau sync_info). Il permettra également de créer SQLite déclencheurs pour regarder l'INSERTION ou la mise à JOUR sur les tables que vous souhaitez synchroniser (pour insérer automatiquement les éléments modifiés dans le new_elem tableau):

DBSYNC.initSync(TABLES_TO_SYNC, webSqlDb, sync_info, 'http://www.myserver.com', callBackEndInit);

Où TABLES_TO_SYNC s'agit de la liste de la table que vous souhaitez synchroniser avec le serveur, ex :

TABLES_TO_SYNC = [
    {tableName : 'table1', idName : 'the_id'},
    {tableName : 'table2'} //if idName not specified, it will assume that it's "id"
];

Synchroniser

Pour démarrer la synchronisation, vous devez appeler le syncNow fonction. Vous pouvez l'appeler toutes les X secondes, ou après quelques modifications, par exemple :

DBSYNC.syncNow(callBackSyncProgress, function(result) {
     if (result.syncOK === true) {
         //Synchronized successfully
     }
});

Et c'est tout ce que vous devez faire sur le client. Sur le côté serveur, vous aurez besoin de votre propre code de solution (mais c'est pas compliqué). Et il y a quelques exemple inPHP & Java. Encore une fois, les contributions sont les bienvenues.

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