La mejor forma de sincronizar la base de datos local HTML5 (almacenamiento webSQL, SQLite) con un servidor (sincronización bidireccional)

Estoy desarrollando una aplicación web móvil (para iPhone y Android) con una base de datos local (utilizando html5 webstorage) para que mi aplicación aún se pueda utilizar cuando el usuario esté desconectado.

Esto está funcionando perfectamente, pero quiero guardar los datos locales en un servidor. Entonces necesito sincronizar el DB local con un DB en un servidor. La sincronización solo puede ser de una sola vía, pero en el futuro me gustaría sincronizarla en ambos sentidos (servidor DB local).

Este requisito parece muy común (o será común en el futuro para la aplicación web móvil), pero no puedo encontrar una biblioteca que lo haga.

Sé que Google está haciendo eso en su aplicación web móvil (por ejemplo, gmail), y el proyecto WSPL me pareció un proyecto de Google, pero sin fuente para descargar.

Si no puedo encontrar una solución, crearé una biblioteca para hacer eso, ya que la sincronización de una manera no parece difícil, pero me pregunto si hay otras soluciones.

  • Creé una lib de JS pequeña llamada WebSqlSync para sincronizar una base de datos WebSql local con un servidor (cliente < -> servidor). Muy fácil de usar e integrar en tu código:

https://github.com/orbitaloop/WebSqlSync

  • El proyecto de código abierto QuickConnect contiene una biblioteca JS para sincronizar el SQLite DB local de HTML5 con un servidor DB (MySQL u otro):

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

Para usar esta lib, necesita usar DataAccessObject del framework para acceder a su DB. Funciona almacenando todas las solicitudes SQL aplicadas a la base de datos (excepto la selección del curso) y enviándolas al servidor. Es genial administrar la eliminación, pero es un poco pesado si tienes muchas actualizaciones, y el servidor necesita usar el mismo lenguaje SQL …

  • Otro proyecto de QuickConnect es una sincronización nativa de SQLite (en Objective C para iOS o Mac OS y en Java para Android):

http://www.quickconnectfamily.org/qcdbsync/ (creo que almacena también el historial de todas las solicitudes SQL)

  • Y acabo de encontrar otra prometedora biblioteca JS: persistenceJS

https://github.com/zefhemel/persistencejs

“persistence.js es una biblioteca de asignadores relacionales de objetos JavaScript asíncronos. Puede usarla en el navegador, así como en el servidor (y puede compartir modelos de datos entre ellos)”.

Tienen un módulo de sincronización DB: DOC de persistence.synch.js

(funciona con HTML5 DB SQLite o Google Gears en el cliente, y MySQL en el servidor)

  • Y también está Impel.inTouch . Parece muy fácil de usar (con archivos php incluidos), pero debe usar el framework Mootools en el lado del cliente:

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

  • Sencha también tiene un servicio de sincronización: Sencha.io . Se ve muy bien, pero depende del marco de Sencha Touch:

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

Desarrollé una solución de sincronización genérica llamada WebSqlSync .

No es dependiente de ningún marco. Está disponible aquí: https://github.com/orbitaloop/WebSqlSync

Extracto del archivo README:

WebSqlSync

Sincronice automáticamente una base de datos WebSql local (SQLite en el navegador) a un servidor. (Sincronización de 2 vías: cliente < -> servidor)

Muy fácil de integrar a su aplicación existente y muy fácil de usar (2 funciones para llamar: initSync y syncNow)

Uso

Inicializar

Necesita inicializar la lib (en cada inicio, por ejemplo).

Creará automáticamente 2 tablas (si aún no existen, una para almacenar todos los elementos nuevos o modificados (tabla new_elem) y otra para almacenar la fecha de la última sincronización (tabla sync_info). También creará activadores SQLite en Para ver INSERTAR o ACTUALIZAR en las tablas que desea sincronizar (para insertar automáticamente los elementos modificados en la tabla new_elem):

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

Donde TABLES_TO_SYNC es la lista de la tabla que desea sincronizar con el servidor, por ejemplo:

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

Sincronizar

Para iniciar la sincronización, debe llamar a la función syncNow. Puede llamarlo cada X segundos o después de algunos cambios, por ejemplo:

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

Y eso es todo lo que debes hacer en el cliente. En el lado del servidor, necesitará codificar su propia solución (pero no es complicado). Y hay algunos ejemplos en PHP y Java. De nuevo, las contribuciones son bienvenidas.