本文的标题是:最佳方法同步本地HTML5数据库(WebSQL存储,SQLite)与服务器(双向同步)。

153
我正在开发一款移动Web应用程序(适用于iPhone和Android),使用本地数据库(使用html5 webstorage),因此即使用户离线,我的应用程序仍然可用。这个功能已经完美运作,但是我想将本地数据保存在服务器上。因此,我需要将本地数据库与服务器上的数据库同步。同步只能是单向的,但将来我希望能够双向同步(服务器<->本地数据库)。
这个要求看起来非常普遍(或者说将来对于移动Web应用程序来说会很普遍),但我找不到可以实现它的库。
我知道谷歌正在他们的移动Web应用程序中执行此操作(例如gmail),并且我找到了WSPL项目,这是一个谷歌项目,但没有源代码可供下载。
如果我找不到解决方案,我将创建一个库来实现它,因为单向同步看起来并不难,但我想知道是否有其他解决方案。

2
我不知道是否有任何库,但最简单的方法似乎是存储修改时间戳,并将更改传输到比另一侧记录更新的记录,以及自上次同步以来的添加和删除。如果本地和服务器时钟不同步,可能会出现问题,但你会想到解决办法的。-- 作为评论发布,因为它可能没有提供答案,也不太有帮助。 - Ivan Vučica
1
CouchDB怎么样?http://couchdb.apache.org/ - julianm
4
主题是用于“讨论”的,而Stack Exchange则是用于“提问”的。曾经在Stack Exchange上也接受像这样的帖子,但现在不再允许。 - casperOne
Microsoft Access有一种使用唯一哈希类型ID同步行的方法。这可以是包括交易日期在内的附加层。如果只有一个表,这是一个简单的任务。当涉及到多个表和依赖关系时,情况就会变得混乱。 - Sun
@JChrisA,你的评论跑题了,我们在谈论WebSQL数据库。 - Samuel
显示剩余6条评论
2个回答

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

https://github.com/orbitaloop/WebSqlSync

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

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

要使用此库,您需要使用框架的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同步模块: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/


3
经过测试后,我决定开发自己的小型JS库,用于将WebSQL与服务器数据库进行同步。它将采用双向同步(本地<->服务器)且不会有任何依赖。完成后,我会在这里发布代码链接。 - Samuel
我曾经遇到过与企业数据库同步移动数据的类似情况。我使用了persistencejs,并根据服务器上的同步/不同步行属性编写了自定义同步逻辑,就像@samuel所提到的那样。 - dhaval
2
我已经提交了我自己的同步解决方案WebSqlSync的第一个版本:https://github.com/orbitaloop/WebSqlSync(参见下面的答案)。 - Samuel
1
大家好,我已经开始为restful同步编写persistencejs插件。它仍在开发中,但如果有人想要查看它,请访问:https://github.com/robertokl/persistencejs,并在服务器/客户端方面使用ruby on rails的工作示例:https://github.com/robertokl/persistencejs-restfulSync-example。 - robertokl
一个相当新的选择是 https://replicache.dev/。 - thSoft
显示剩余5条评论

18
我开发了一个通用的同步解决方案,名为WebSqlSync。
它不依赖于任何框架。您可以在这里找到它: https://github.com/orbitaloop/WebSqlSync 以下是README文件的摘录:

WebSqlSync

自动将本地 WebSql 数据库(浏览器中的 SQLite)与服务器同步。(2向同步:客户端<->服务器)

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

用法

初始化

您需要初始化库(例如每次启动时)。

它将自动创建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上运行。但是,由于W3C已经弃用了API,因此它无法在IE和Firefox上运行。 - Samuel
好的,有正面和负面的东西。谢谢回顾! - Niklas
2
你有类似的东西,但是针对localStorage而不是WebSQL吗? - user2134555

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接