Meilleure façon de synchroniser la base de données HTML5 locale (stockage WebSQL, SQLite) avec un serveur (synchronisation à 2 voies) [fermé]

je développe une application web mobile (pour iPhone et Android) avec une base de données locale (en utilisant HTML5 webstorage) de sorte que mon application est toujours utilisable lorsque l'utilisateur est hors ligne.

Cela fonctionne parfaitement, mais je veux enregistrer les données sur un serveur. Donc j'ai besoin de synchroniser la base de données locale avec une base de données sur un serveur. La synchronisation ne peut être que d'une seule façon, mais à l'avenir, je voudrais la synchroniser dans les deux sens (serveur local DB).

Ce requierement semble très commun (ou sera commun à l'avenir pour l'application web mobile), mais je ne peux pas trouver une bibliothèque faisant cela.

je sais que google fait cela dans son application web mobile (ex. gmail), et j'ai trouvé le wspl project un projet google, mais sans source à télécharger.

si Je ne trouve pas de solution, je vais créer une bibliothèque pour le faire, car une façon de synchroniser ne semble pas difficile, mais je me demande s'il y a d'autres solutions.

150
demandé sur Samuel 2009-11-16 23:02:47

2 réponses

  • j'ai créé un petit fichier JS appelé WebSqlSync pour synchroniser un serveur local DB WebSql 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 de DB (MySQL ou autre) :

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

pour utiliser ce lib, vous devez utiliser le DataAccessObject du framework pour accéder à votre DB. Il 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 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 une autre bibliothèque JS prometteuse : persistenceJS

https://github.com/zefhemel/persistencejs

"la persistance.js est une bibliothèque Javascript asynchrone pour objets relationnels mapper. 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 un module de synchronisation DB: DOC de persistance.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 semble très facile à utiliser( avec les fichiers php inclus), mais vous devez utiliser le cadre Mootools du côté client:

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

  • Sencha a aussi un service de synchronisation: Sencha.io . Ça a l'air génial, mais ça dépend du cadre Sencha Touch:

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

71
répondu Samuel 2012-02-02 16:06:26

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. (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)

Utilisation

Initialiser

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

il va créer 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 sync (tableau sync_info). Il va également créer des déclencheurs SQLite afin de regarder L'insertion ou la mise à jour sur les tables que vous voulez 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 des tables que vous voulez 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 appelez-le toutes les X secondes, ou après quelques changements 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. Du côté du serveur, vous aurez besoin de coder votre propre solution (mais ce n'est pas compliqué). Et il y a quelques exemples dansphp & Java. Encore une fois, les contributions sont les bienvenues.

18
répondu Samuel 2014-03-30 18:22:47