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


151

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

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

这种要求看起来很普通(或者将来在移动Web应用程序中很常见),但是我找不到这样做的库。

我知道google在他们的移动网络应用程序(例如gmail)中正在执行此操作,并且我发现WSPL项目是google项目,但没有源可供下载。

如果找不到解决方案,我将创建一个库来执行此操作,因为同步的一种方式看起来并不困难,但我想知道是否还有其他解决方案。


2
我不知道是否有任何库,但最简单的方法似乎是存储修改时间戳记,并将更改传输到比另一端的记录新的记录,还传输自上次同步以来的添加和删除。如果本地时钟和服务器时钟不同步,可能会发疯,但是您会想到一些事情。-发表评论,因为它可能不是很有用,并且无法为您提供答案。
伊万·武西卡(IvanVučica)2010年

谢谢伊万。没错,如果本地时钟和服务器时钟不同步,可能会很混乱...我刚刚发现:quickconnect.pbworks.com/Using-Enterprise-Synchronization 它说它可以与本地HTML 5 DB同步。服务器中的数据库。我需要对此进行更深入的研究,看看它是否可以在QuickConnect Framework之外运行...
Samuel 2010年

我找到了另一个解决方案:impel.simulacre.org/blog/…看起来不错,但是您将需要使用Mootools库和Impel ORM ...
Samuel 2010年


4
主题用于讨论,Stack Exchange用于问题。有一次,像这样的帖子在Stack Exchange上被接受,但不再被接受。
casperOne 2013年

Answers:


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

https://github.com/orbitaloop/WebSqlSync

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

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

要使用此库,您需要使用框架的DataAccessObject访问数据库。它通过存储应用于数据库的所有SQL请求(当然不包括select)并将它们发送到服务器来工作。管理删除非常好,但是如果您有很多更新,那么它会很繁重,并且服务器需要使用相同的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同步模块: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/


嗨,塞缪尔(Samuel),js lib对您有用吗?
Mathias Conradt'8

DB同步现在不是我的首要任务,所以我只是放弃,等待一个更标准,更强大的解决方案...
Samuel 2010年

3
测试完所有这些之后,我想我将开发自己的小型JS库,以将WebSQL与服务器DB同步。这将是双重同步(本地<->服务器),并且没有任何依赖性。一旦完成,我将在此处发布指向代码的链接
Samuel

2
我已经提交了自己的同步解决方案的第一个版本,名为WebSqlSync:github.com/orbitaloop/WebSqlSync(参见下面的答案)
Samuel

1
嗨,大家好,我已经启动了persistencejs插件以实现平稳同步。它仍然在开发中,但是如果有人想查看它:github.com/robertokl/persistencejs和在服务器/客户端上运行示例,并且在Ruby上运行:github.com/robertokl/persistencejs-restfulSync-example
robertokl

18

我已经开发了一个称为WebSqlSync的通用同步解决方案。

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

README文件的摘录:

WebSqlSync

自动将本地WebSql数据库(导航器中的SQLite)同步到服务器。(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);

其中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
     }
});

这就是您需要在客户端上执行的所有操作。在服务器端,您将需要编写自己的解决方案(但并不复杂)。在PHP和Java中有一些示例。再次,欢迎捐款。


一年后总结一下,您说这对您有多好?我正在寻找一个适用于浏览器和移动单元的好的客户端数据库。
Niklas

1
WebSQLSync在生产中的超过25个应用程序(iOS和Android)上运行良好。WebSQL确实很棒而又快速。它可以在iOS,Android,Blackberry(我认为是最新版本)以及chrome和safari上运行。但是它不能在IE和firefox上使用,因为API已被W3C贬值
Samuel

好吧,那里既有正面也有负面。感谢您的回顾!
尼古拉斯

2
除了localStorage而不是WebSQL之外,您是否有类似的东西?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.