Melhor maneira de sincronizar o banco de dados HTML5 local (armazenamento WebSQL, SQLite) com um servidor (sincronização bidirecional) [fechado]

151

Estou desenvolvendo um aplicativo da web móvel (para iPhone e Android) com um banco de dados local (usando o armazenamento da web html5) para que meu aplicativo ainda seja utilizável quando o usuário estiver offline.

Isso está funcionando perfeitamente, mas quero salvar os dados locais em um servidor. Então, eu preciso sincronizar o banco de dados local com um banco de dados em um servidor. A sincronização pode ser apenas de uma maneira, mas, no futuro, eu gostaria de sincronizá-la da mesma maneira (servidor <-> banco de dados local).

Esse requisito parece muito comum (ou será comum no futuro para aplicativos 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 Web móvel (por exemplo, gmail), e eu achei 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, pois a sincronização unidirecional não parece difícil, mas me pergunto se há outras soluções.

Samuel
fonte
2
Não sei se existem bibliotecas, mas a maneira mais fácil de fazer isso parece armazenar o carimbo de data / hora da modificação e transferir alterações para registros mais recentes que os registros do outro lado, além de transferir adições e exclusões desde a última sincronização. Pode ficar louco se os relógios local e do servidor não estiverem sincronizados, mas você pensará em algo. - Postar como comentário, pois provavelmente não é muito útil e não fornece uma resposta.
Ivan Vučica
Obrigado Ivan. Você está certo, se os relógios local e do servidor não estiverem sincronizados, pode ser uma bagunça ... Acabei de descobrir que: quickconnect.pbworks.com/Using-Enterprise-Synchronization Ele diz que pode sincronizar um banco de dados HTML 5 local com um DB em um servidor. Eu preciso dar uma olhada mais profunda nisso e ver se ele pode ser executado fora do QuickConnect Framework ...
Samuel
Eu encontrei outra solução: impel.simulacre.org/blog/... Parece ótimo, mas você terá de usar a biblioteca Mootools, eo Impel ORM ...
Samuel
1
E o CouchDB? couchdb.apache.org
julianm 3/11/11
4
Os tópicos são para discussão , o Stack Exchange é para perguntas . Em um ponto, postagens como essa foram aceitas no Stack Exchange, mas não mais.
precisa saber é o seguinte

Respostas:

70
  • Criei uma pequena biblioteca JS chamada WebSqlSync para sincronizar um banco de dados WebSql local com um servidor (cliente <-> servidor). Muito fácil de usar e integrar no seu código:

https://github.com/orbitaloop/WebSqlSync

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

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

Para usar esta lib, você precisa usar o DataAccessObject da estrutura para acessar seu banco de dados. Ele funciona armazenando toda a solicitação SQL aplicada ao banco de dados (exceto selecionar, é claro) e enviando-as 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 sincronização SQLite nativa (no Objective C para iOS ou Mac OS e em 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 mapeadores relacional a objetos Javascript assíncrona. Você pode usá-lo no navegador e também no servidor (e pode compartilhar modelos de dados entre eles)."

Eles têm um módulo de sincronização de banco de dados: DOC of persistence.synch.js

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

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

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

  • O Sencha também possui um serviço de sincronização: Sencha.io . Parece ótimo, mas depende da estrutura do Sencha Touch:

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

Samuel
fonte
Oi Samuel, o js lib funcionou para você?
Mathias Conradt
DB sync não é minha prioridade por agora, então eu simplesmente desistir, à espera de uma solução mais padrão e robusto ...
Samuel
3
Depois de testar todos eles, acho que desenvolverei minha própria pequena lib JS para sincronizar o WebSQL com um banco de dados do servidor. Será uma sincronização dupla (servidor local <->) e não terá nenhuma dependência. Vou postar aqui o link para o código assim que terminar
Samuel
2
Tenho cometido a primeira versão da minha própria solução de sincronização chamado WebSqlSync: github.com/orbitaloop/WebSqlSync (cf abaixo resposta)
Samuel
1
Olá pessoal, eu iniciei um plugin persistencejs para sincronização repousante. Ele ainda está em desenvolvimento, mas se alguém quiser conferir: github.com/robertokl/persistencejs e um exemplo de trabalho no servidor / cliente com ruby ​​on rails: github.com/robertokl/persistencejs-restfulSync-example
robertokl
18

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

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

Extração do arquivo README:

WebSqlSync

Sincronize automaticamente um banco de dados WebSql local (SQLite no navegador) para um servidor. (Sincronização bidirecional: cliente <-> servidor)

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

Uso

Inicializar

Você precisa inicializar a lib (em cada inicialização, por exemplo).

Ele criará automaticamente 2 tabelas (se ainda não existirem, uma para armazenar todos os elementos novos ou modificados (tabela new_elem) e outra para armazenar a data da última sincronização (tabela sync_info). Também criará gatilhos SQLite no para assistir a 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 da tabela que você deseja sincronizar com o servidor, por exemplo:

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 sincronização, você precisa chamar a função 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 o 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 em PHP e Java. Mais uma vez, contribuições são bem-vindas.

Samuel
fonte
Você diria que isso funcionou para você, resumindo-o um ano depois? Estou procurando um bom banco de dados do lado do cliente que funcione para navegadores e unidades móveis.
Niklas
1
O WebSQLSync está funcionando muito bem com mais de 25 aplicativos em produção (iOS e Android). O WebSQL é realmente ótimo e rápido. Ele está funcionando no iOS, Android, Blackberry (a versão mais recente, eu acho) e, claro, no Chrome e Safari. Mas ele não está funcionando no IE e Firefox, porque a API foi depreciado pelo W3C ..
Samuel
Tudo bem, tanto positivos como negativos lá. Obrigado pela recapitulação!
Niklas
2
Você tem algo parecido, exceto para localStorage e não WebSQL?