Melhor maneira de sincronizar o DB HTML5 local (WebSQL Storage, SQLite) com um servidor (synchronization de 2 vias)

Estou desenvolvendo um aplicativo da web móvel (para iPhone e Android) com um database local (usando o html5 webstorage) para que meu aplicativo ainda possa ser usado quando o usuário estiver off-line.

Isso está funcionando perfeitamente, mas quero salvar os dados locais em um servidor. Então eu preciso sincronizar o database local com um database em um servidor. A synchronization só pode ser unidirecional, mas no futuro, eu gostaria de sincronizá-lo nos dois sentidos (servidor DB local).

Esse requierement parece muito comum (ou será comum no futuro para o aplicativo da web para dispositivos móveis), mas não consigo encontrar uma biblioteca fazendo isso.

Eu sei que o Google está fazendo isso em seu aplicativo da web móvel (ex. Gmail), e eu encontrei o projeto WSPL um projeto do Google, mas sem fonte para download.

Se não conseguir encontrar uma solução, criarei uma biblioteca para fazer isso, já que uma maneira de synchronization não parece difícil, mas gostaria de saber se há outras soluções.

  • Eu criei um pequeno JS chamado WebSqlSync para sincronizar um database WebSQL local com um servidor (cliente <-> servidor). Muito fácil de usar e integrar em seu código:

https://github.com/orbitaloop/WebSqlSync

  • O projeto de código aberto QuickConnect contém uma biblioteca JS para sincronizar o database SQLite HTML5 local com um database do servidor (MySQL ou outro):

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

Para usar essa biblioteca, você precisa usar o DataAccessObject da estrutura para acessar seu database. Ele funciona armazenando toda a solicitação SQL aplicada ao database (exceto a seleção, é claro) e enviando-os para o servidor. É ótimo gerenciar a exclusão, mas é um pouco pesado se você tiver muitas atualizações e o servidor precisar usar a mesma linguagem SQL …

  • Outro projeto do QuickConnect é uma synchronization SQLite nativa (no Objective C para iOS ou Mac OS e no Java para Android):

http://www.quickconnectfamily.org/qcdbsync/ (acho que também armazena o histórico de todas as solicitações SQL)

  • E acabei de encontrar outra biblioteca JS promissora: persistenceJS

https://github.com/zefhemel/persistencejs

“persistence.js é uma biblioteca de mapeamento object-relacional Javascript assíncrona. Você pode usá-lo no navegador, bem como no servidor (e você pode compartilhar modelos de dados entre eles).”

Eles têm um módulo de synchronization de database: DOC de persistence.synch.js

(funciona com HTML5 DB SQLite ou Google Gears no cliente e MySQL no servidor)

  • E há também Impel.inTouch . Parece muito fácil de usar (com arquivos php incluídos), mas você deve usar o framework Mootools no lado do cliente:

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

  • Sencha também tem um serviço de synchronization: Sencha.io . Parece ótimo, mas é dependente da estrutura do Sencha Touch:

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

Eu desenvolvi uma solução de synchronization genérica chamada WebSqlSync .

Não depende de nenhum framework. Está disponível aqui: https://github.com/orbitaloop/WebSqlSync

Extrato do arquivo README:

WebSqlSync

Sincronize automaticamente um database WebSql local (SQLite no navegador) para um servidor. (Sincronização de 2 vias: cliente <-> servidor)

Muito fácil de integrar ao seu aplicativo existente e muito fácil de usar (2 funções para chamar: initSync e syncNow)

Uso

Inicializar

Você precisa inicializar o lib (a cada boot, por exemplo).

Ele irá criar automaticamente 2 tabelas (se elas já não existirem, uma para armazenar todos os elementos novos ou modificados (tabela new_elem) e outra para armazenar a data da última synchronization (tabela sync_info). Também irá criar triggers SQLite em Para assistir ao INSERT ou UPDATE nas tabelas que você deseja sincronizar (para inserir automaticamente os elementos modificados na tabela new_elem):

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

Onde TABLES_TO_SYNC é a lista de tabelas que você deseja sincronizar com o servidor, ex:

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

Sincronizar

Para iniciar a synchronization, você precisa chamar a function syncNow. Você pode chamá-lo a cada X segundos ou após algumas alterações, por exemplo:

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

E isso é tudo que você precisa fazer no cliente. No lado do servidor, você precisará codificar sua própria solução (mas não é complicado). E há alguns exemplos no PHP e Java. Mais uma vez, as contribuições são bem vindas.

Intereting Posts