同步本地HTML5数据库(WebSQL存储,SQLite)与服务器(2路同步)的最佳途径

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

这是完美的工作,但我想保存在服务器上的本地数据。 所以我需要将本地数据库与服务器上的数据库同步。 同步只能是一种方式,但是将来我想同时进行同步(server < – > local DB)。

这个要求看起来很常见(或将在移动networking应用程序的未来普遍),但我找不到一个图书馆这样做。

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

如果我找不到解决scheme,我会创build一个库来做到这一点,因为一个方法同步并不困难,但我不知道是否有其他解决scheme。

  • 我创build了一个名为WebSqlSync的小型JS库,用于将本地WebSql数据库与服务器(客户端< – >服务器)同步。 非常容易使用,并集成在您的代码中:

https://github.com/orbitaloop/WebSqlSync

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

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

要使用这个库,你需要使用框架的DataAccessObject来访问你的数据库。 它通过存储应用于数据库的所有SQL请求(当然除外)并将它们发送到服务器来工作。 pipe理删除非常好,但是如果你有很多更新,服务器需要使用相同的SQL语言,那么这是很重要的。

  • QuickConnect的另一个项目是一个本地的SQLite同步(在Objective-C for iOS或Mac OS中,在Java中为Android):

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

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

https://github.com/zefhemel/persistencejs

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

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

(使用客户端上的HTML5数据库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/

我开发了一个名为WebSqlSync的通用同步解决scheme。

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

自述文件的摘录:

WebSqlSync

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

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

用法

初始化

你需要初始化lib(例如每次启动时)。

它会自动创build2个表(如果它们不存在,一个存储所有新的或修改的元素(表new_elem),一个存储最后一个同步的date(表sync_info)。它还将创buildSQLite触发器要在要同步的表上观看INSERT或UPDATE(自动将已修改的元素插入到new_elem表中):

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

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

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

同步

要开始同步,您需要调用syncNow函数。 你可以每X秒调用一次,或者在一些变化之后调用它,例如:

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

这就是你需要在客户端上做的一切。 在服务器端,你需要编写你自己的解决scheme(但并不复杂)。 在PHP和Java中有一些例子。 再次表示欢迎。