La mejor manera de sincronizar la base de datos HTML5 local (almacenamiento WebSQL, SQLite) con un servidor (sincronización de 2 vías) [cerrado]

151

Estoy desarrollando una aplicación web móvil (para iPhone y Android) con una base de datos local (usando html5 webstorage) para que mi aplicación siga siendo utilizable cuando el usuario está desconectado.

Esto funciona perfectamente, pero quiero guardar los datos locales en un servidor. Entonces necesito sincronizar la base de datos local con una base de datos en un servidor. La sincronización solo puede ser unidireccional, pero en el futuro, me gustaría sincronizarla en ambos sentidos (servidor <-> DB local).

Este requisito parece muy común (o lo será 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 encontré el proyecto WSPL como un proyecto de google pero sin fuente para descargar.

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

Samuel
fuente
2
No sé si hay libs, pero la forma más fácil de hacerlo parece ser almacenar la marca de tiempo de modificación y transferir los cambios a los registros que son más nuevos que los registros en el otro lado, y también transferir adiciones y eliminaciones desde la última sincronización. Puede volverse loco si los relojes locales y del servidor no están sincronizados, pero pensarás en algo. - Publicar como comentario ya que probablemente no sea muy útil y no le brinde una respuesta.
Ivan Vučica
Gracias Ivan. Tiene razón, si los relojes locales y del servidor no están sincronizados, podría ser desordenado ... Acabo de encontrar eso: quickconnect.pbworks.com/Using-Enterprise-Synchronization Dice que puede sincronizar una base de datos HTML 5 local con un DB en un servidor. Necesito tener una mirada más profunda sobre eso, y ver si puede ejecutarse fuera del QuickConnect Framework ...
Samuel
Encontré otra solución: impel.simulacre.org/blog/… Se ve muy bien, pero necesitará usar la biblioteca Mootools y el Impel ORM ...
Samuel
1
¿Qué tal CouchDB? couchdb.apache.org
julianm
44
Los temas son para discusiones , Stack Exchange es para preguntas . En un momento, publicaciones como esta fueron aceptadas en Stack Exchange, pero ya no.
casperOne

Respuestas:

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

https://github.com/orbitaloop/WebSqlSync

  • El proyecto de código abierto QuickConnect contiene una biblioteca JS para sincronizar la base de datos SQLite HTML5 local a una base de datos del servidor (MySQL u otro):

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

Para usar esta biblioteca, debe usar el DataAccessObject del marco para acceder a su base de datos. Funciona almacenando todas las solicitudes SQL aplicadas a la base de datos (excepto seleccionar, por supuesto), y enviándolas al servidor. Es genial administrar la eliminación, pero es un poco pesado si tiene muchas actualizaciones, y el servidor necesita usar el mismo lenguaje SQL ...

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

http://www.quickconnectfamily.org/qcdbsync/ (creo que también almacena 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 mapeo relacional de objetos Javascript asíncrono. Puede usarlo en el navegador y también en el servidor (y puede compartir modelos de datos entre ellos)".

Tienen un módulo de sincronización de base de datos: DOC of 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 marco 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 Sencha Touch:

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

Samuel
fuente
Hola Samuel, ¿te funcionó la js lib?
Mathias Conradt
La sincronización de DB no es mi prioridad por ahora, así que me doy por vencido, esperando una solución más estándar y robusta ...
Samuel
3
Después de probarlos todos, creo que desarrollaré mi propia pequeña JS lib para sincronizar WebSQL con un servidor DB. Será una sincronización doble (servidor local <->) y no tendrá ninguna dependencia. Publicaré aquí el enlace al código una vez que termine
Samuel
2
He comprometido la primera versión de mi propia solución de sincronización llamada WebSqlSync: github.com/orbitaloop/WebSqlSync (cf respuesta a continuación)
Samuel
1
Hola chicos, he comenzado un complemento persistencejs para una sincronización tranquila. Es todavía en desarrollo, pero si alguien quiere echarle un vistazo: github.com/robertokl/persistencejs y un ejemplo de trabajo en el lado del servidor / cliente con Ruby on Rails: github.com/robertokl/persistencejs-restfulSync-example
robertokl
18

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

No depende 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 bidireccional: 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

Debe 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 comenzar 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 necesita hacer en el cliente. En el lado del servidor, deberá codificar su propia solución (pero no es complicado). Y hay algunos ejemplos en PHP y Java. Nuevamente, las contribuciones son bienvenidas.

Samuel
fuente
¿Qué tan bien diría que esto le ha funcionado, resumiéndolo un año después? Estoy buscando una buena base de datos del lado del cliente que funcione para navegadores y unidades móviles.
Niklas
1
WebSQLSync funciona muy bien con más de 25 aplicaciones en producción (iOS y Android). WebSQL es realmente genial y rápido. Funciona en iOS, Android, Blackberry (la última versión, creo) y, por supuesto, Chrome y Safari. Pero no funciona en IE y Firefox, porque la API ha sido depreciada por W3C ..
Samuel
Muy bien, tanto positivos como negativos allí. Gracias por el resumen!
Niklas
2
¿Tiene algo similar excepto para localStorage y no WebSQL?