153

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

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

这种要求看起来很常见(或者将来对于移动网络应用程序会很常见),但我找不到这样做的图书馆。

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

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

4

2 回答 2

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

https://github.com/orbitaloop/WebSqlSync

  • 开源项目QuickConnect包含一个 JS 库,用于将本地 HTML5 SQLite DB 同步到服务器 DB(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 对象关系映射器库。您可以在浏览器中使用它,也可以在服务器上使用它(并且您可以在它们之间共享数据模型)。​​”

他们有一个数据库同步模块:persistence.synch.js 的文档

(在客户端使用 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/

于 2010-02-22T20:32:02.883 回答
18

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

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

自述文件的摘录:

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 中有一些例子。再次,欢迎贡献。

于 2012-02-02T14:54:55.387 回答