web-dev-qa-db-fra.com

Meilleure façon de synchroniser une 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 (utilisant html5 webstorage) afin que mon application soit toujours utilisable lorsque l'utilisateur est hors ligne.

Cela fonctionne parfaitement, mais je veux enregistrer les données locales sur un serveur. Je dois donc synchroniser la base de données locale avec une base de données sur un serveur. La synchronisation ne peut être que dans un sens, mais à l’avenir, j’aimerais le synchroniser dans les deux sens (serveur <-> base de données locale).

Cette requête semble très courante (ou le sera à l'avenir pour les applications Web mobiles), mais je ne trouve pas de bibliothèque qui le fasse.

Je sais que Google le fait dans son application Web mobile (par exemple, Gmail) et j'ai trouvé le projet WSPL , un projet Google mais sans source à télécharger.

Si je ne trouve pas de solution, je créerai une bibliothèque pour le faire, car la synchronisation ne semble pas difficile, mais je me demande s’il existe d’autres solutions.

150
Samuel
  • J'ai créé une petite bibliothèque JS appelée WebSqlSync pour synchroniser une base de données WebSql locale 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 permettant de synchroniser la base de données HTML5 SQLite locale sur une base de données serveur (MySQL ou autre):

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

Pour utiliser cette bibliothèque, vous devez utiliser le DataAccessObject du framework pour accéder à votre base de données. Cela fonctionne en stockant toutes les requêtes SQL appliquées à la base de données (sauf select of course) et en les envoyant au serveur. C’est bien de gérer la suppression, mais c’est un peu lourd si vous avez beaucoup de mises à jour, et le serveur doit utiliser le même langage SQL ...

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

http://www.quickconnectfamily.org/qcdbsync/ (Je pense qu'il stocke également l'historique de toutes les requêtes SQL)

  • Et je viens de trouver une autre bibliothèque JS prometteuse: persistenceJS

https://github.com/zefhemel/persistencejs

"persistence.js est une bibliothèque de mappeurs Javascript relation-objet asynchrones. Vous pouvez l'utiliser dans le navigateur, ainsi que sur le serveur (et vous pouvez partager des modèles de données entre eux)."

Ils ont un module de synchronisation DB: 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 . Cela semble très facile à utiliser (avec les fichiers php inclus), mais vous devez utiliser le framework Mootools du côté client:

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

  • Sencha a également un service de synchronisation: Sencha.io . Ça a l'air génial, mais cela dépend du framework Sencha Touch:

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

71
Samuel

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

Cela ne dépend d'aucun cadre. Il est disponible ici: https://github.com/orbitaloop/WebSqlSync

Extrait du fichier README:

WebSqlSync

Synchronise automatiquement une base de données WebSql locale (SQLite dans le navigateur) sur un serveur. (Sync bidirectionnelle: client <-> serveur)

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

Usage

Initialiser

Vous devez initialiser la bibliothèque (à chaque démarrage par exemple).

Il créera automatiquement 2 tables (si elles n'existent pas déjà, une pour stocker tous les éléments nouveaux ou modifiés (table new_elem) et une pour stocker la date de la dernière synchronisation (table sync_info). Elle créera également des déclencheurs SQLite dans Afin de regarder le INSERT ou UPDATE sur les tables que vous souhaitez synchroniser (pour insérer automatiquement les éléments modifiés dans la table new_elem):

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

Où TABLES_TO_SYNC est 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 la fonction syncNow. 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. Côté serveur, vous devrez coder votre propre solution (mais ce n’est pas compliqué). Et il y a quelques exemples dans PHP & Java. Encore une fois, les contributions sont les bienvenues.

18
Samuel