将本地HTML5 DB(WebSQL存储,SQLite)与服务器同步的最佳方法(双向同步)

Sam*_*uel 150 html5 storage web-applications data-synchronization

我正在使用本地数据库(使用html5 webstorage)开发移动Web应用程序(用于iPhone和Android),因此当用户离线时我的应用程序仍然可用.

这工作正常,但我想将本地数据保存在服务器上.所以我需要将本地数据库与服务器上的数据库同步.同步只能是一种方式,但在将来,我想以两种方式同步它(服务器< - >本地数据库).

这种需求看起来非常普遍(或者将来在移动网络应用程序中很常见),但我找不到这样做的库.

我知道谷歌正在他们的移动网络应用程序(例如gmail)中这样做,我发现WSPL项目是一个谷歌项目,但没有下载源.

如果我找不到解决方案,我会创建一个库来做到这一点,因为单向同步看起来并不困难,但我想知道是否还有其他解决方案.

Sam*_*uel 71

  • 我创建了一个名为WebSqlSync的小型JS库,用于将本地WebSql DB与服务器(客户端< - >服务器)同步.非常易于使用并集成到您的代码中:

https://github.com/orbitaloop/WebSqlSync

  • 开源项目QuickConnect包含一个JS库,用于将本地HTML5 SQLite DB与服务器DB(MySQL或其他)同步:

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

要使用此lib,您需要使用框架的DataAccessObject来访问您的数据库.它的工作原理是存储应用于数据库的所有SQL请求(当然除了选择),并将它们发送到服务器.管理删除很棒,但是如果你有很多更新,那么它有点重,服务器需要使用相同的SQL语言......

  • QuickConnect的另一个项目是原生SQLite同步(在iOS或Mac OS的Objective C和Android的Java中):

http://www.quickconnectfamily.org/qcdbsync/ (我认为它还存储了所有SQL请求的历史记录)

  • 我刚刚发现了另一个有前途的JS库:persistenceJS

https://github.com/zefhemel/persistencejs

"persistence.js是一个异步Javascript对象关系映射器库.您可以在浏览器中使用它,也可以在服务器上使用它(并且您可以在它们之间共享数据模型).​​"

他们有一个DB synch模块:persistence.synch.js的DOC

(适用于客户端上的HTML5 DB SQLite或Google Gears,以及服务器上的MySQL)

  • 而且还有Impel.inTouch.它看起来很容易使用(包含php文件),但你必须在客户端使用Mootools框架:

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

  • Sencha还有一个同步服务:Sencha.io.看起来很棒,但它依赖于Sencha Touch框架:

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

  • 在测试了所有这些之后,我想我会开发自己的小型JS库来同步WebSQL和服务器数据库.它将是一个双同步(本地< - >服务器),不会有任何依赖.我会在这里发布完成后代码的链接 (3认同)
  • 我已经提交了我自己的同步解决方案的第一个版本,名为WebSqlSync:https://github.com/orbitaloop/WebSqlSync(参见下面的答案) (2认同)

Sam*_*uel 18

我开发了一个名为WebSqlSync的通用同步解决方案.

它不依赖于任何框架.它可以在这里找到:https: //github.com/orbitaloop/WebSqlSync

README文件的摘录:

WebSqlSync

自动将本地WebSql数据库(导航器中的SQLite)同步到服务器.(2路同步:客户端< - >服务器)

很容易集成到您现有的应用程序,非常容易使用(2个函数调用:initSync和syncNow)

用法

初始化

您需要初始化lib(例如,在每次启动时).

它将自动创建2个表(如果它们尚不存在,一个用于存储所有新的或已修改的元素(表new_elem),另一个用于存储上次同步的日期(表sync_info).它还将创建SQLite触发器为了观察要同步的表的INSERT或UPDATE(在new_elem表中自动插入修改后的元素):

DBSYNC.initSync(TABLES_TO_SYNC, webSqlDb, sync_info, 'http://www.myserver.com', callBackEndInit);
Run Code Online (Sandbox Code Playgroud)

其中TABLES_TO_SYNC是您要与服务器同步的表的列表,例如:

TABLES_TO_SYNC = [
    {tableName : 'table1', idName : 'the_id'},
    {tableName : 'table2'} //if idName not specified, it will assume that it's "id"
];
Run Code Online (Sandbox Code Playgroud)

同步

要启动同步,您需要调用syncNow函数.您可以每隔X秒调用一次,或者在某些更改后调用它,例如:

DBSYNC.syncNow(callBackSyncProgress, function(result) {
     if (result.syncOK === true) {
         //Synchronized successfully
     }
});
Run Code Online (Sandbox Code Playgroud)

这就是你需要在客户端做的一切.在服务器端,您需要编写自己的解决方案(但并不复杂).在PHP和Java中也有一些例子.再次,欢迎捐款.

  • 除了 localStorage 而不是 WebSQL,你有没有类似的东西? (2认同)