Meilleur moyen de synchroniser la base de données HTML5 locale (stockage WebSQL, SQLite) avec un serveur (synchronisation bidirectionnelle) [fermé]

151

Je développe une application Web mobile (pour iPhone et Android) avec une base de données locale (en utilisant le stockage Web html5) afin que mon application soit toujours utilisable lorsque l'utilisateur est hors ligne.

Cela fonctionne parfaitement, mais je souhaite enregistrer les données locales sur un serveur. J'ai donc besoin de synchroniser la base de données locale avec une base de données sur un serveur. La synchronisation ne peut être que dans un seul sens, mais à l'avenir, je voudrais la synchroniser dans les deux sens (serveur <-> DB local).

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

Je sais que Google fait cela dans leur application Web mobile (ex. Gmail), et j'ai trouvé le projet WSPL comme 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 la synchronisation à sens unique ne semble pas difficile, mais je me demande s'il existe d'autres solutions.

Samuel
la source
2
Je ne sais pas s'il existe des bibliothèques, mais le moyen le plus simple de le faire semble être de stocker l'horodatage des modifications, de transférer les modifications vers les enregistrements qui sont plus récents que les enregistrements de l'autre côté, ainsi que de transférer les ajouts et les suppressions depuis la dernière synchronisation. Cela peut devenir fou si les horloges locales et du serveur ne sont pas synchronisées, mais vous penserez à quelque chose. - Publier comme commentaire car ce n'est probablement pas très utile et ne vous donne pas de réponse.
Ivan Vučica
Merci Ivan. Vous avez raison, si les horloges locales et du serveur ne sont pas synchronisées, cela pourrait être désordonné ... Je viens de trouver que: quickconnect.pbworks.com/Using-Enterprise-Synchronization Il dit qu'il peut synchroniser un HTML 5 DB local avec un DB dans un serveur. J'ai besoin d'examiner de plus près cela et de voir si cela peut fonctionner en dehors du cadre QuickConnect ...
Samuel
J'ai trouvé une autre solution: impel.simulacre.org/blog /... Ça a l'air génial, mais vous devrez utiliser la bibliothèque Mootools et l'Impel ORM ...
Samuel
1
Et CouchDB? couchdb.apache.org
julianm
4
Les sujets sont pour les discussions , Stack Exchange est pour les questions . À un moment donné, des messages comme celui-ci ont été acceptés sur Stack Exchange, mais plus maintenant.
casperOne

Réponses:

70
  • J'ai créé une petite bibliothèque JS nommée WebSqlSync pour synchroniser une base de données WebSql locale avec un serveur (client <-> serveur). Très simple d'utilisation et à intégrer dans votre code:

https://github.com/orbitaloop/WebSqlSync

  • Le projet open source QuickConnect contient une bibliothèque JS pour synchroniser la base de données SQLite HTML5 locale avec 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. Il fonctionne en stockant toutes les requêtes SQL appliquées à la base de données (sauf select bien sûr), 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 que 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 mappage relationnel objet Javascript asynchrone. 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 de base de données: 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 côté client:

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

  • Sencha dispose également d'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/

Samuel
la source
Salut Samuel, est-ce que le js lib a fonctionné pour vous?
Mathias Conradt
La synchronisation DB n'est pas ma priorité pour le moment, alors j'abandonne, en attendant une solution plus standard et robuste ...
Samuel
3
Après les avoir tous testés, je pense que je vais développer ma propre petite bibliothèque JS pour synchroniser WebSQL avec une base de données serveur. Ce sera une double synchronisation (serveur <-> local) et n'aura aucune dépendance. Je posterai ici le lien vers le code une fois terminé
Samuel
2
J'ai commis la première version de ma propre solution de synchronisation nommée WebSqlSync: github.com/orbitaloop/WebSqlSync (cf réponse ci-dessous)
Samuel
1
Salut les gars, j'ai lancé un plugin persistencejs pour une synchronisation reposante. Il est encore en développement, mais si quelqu'un veut le vérifier: github.com/robertokl/persistencejs et un exemple de travail côté serveur / client avec ruby ​​on rails: github.com/robertokl/persistencejs-restfulSync-example
robertokl
18

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

Synchronisez automatiquement une base de données WebSql locale (SQLite dans le navigateur) avec un serveur. (Synchronisation 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 lib (à 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). Il créera également des déclencheurs SQLite dans afin de regarder l'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 des tables 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 inPHP & Java. Encore une fois, les contributions sont les bienvenues.

Samuel
la source
Dans quelle mesure diriez-vous que cela a fonctionné pour vous, en le résumant un an plus tard? Je recherche une bonne base de données côté client qui fonctionne pour les navigateurs et les unités mobiles.
Niklas
1
WebSQLSync fonctionne très bien avec plus de 25 applications en production (iOS et Android). WebSQL est vraiment génial et rapide. Cela fonctionne sur iOS, Android, Blackberry (la dernière version je pense) et bien sûr Chrome et Safari. Mais cela ne fonctionne pas sur IE et Firefox, car l'API a été dépréciée par le W3C ..
Samuel
D'accord, à la fois positifs et négatifs. Merci pour le récapitulatif!
Niklas
2
Avez-vous quelque chose de similaire mais pour localStorage et non WebSQL?