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

Posted

技术标签:

【中文标题】将本地 HTML5 DB(WebSQL 存储,SQLite)与服务器同步的最佳方法(2 路同步)[关闭]【英文标题】:Best way to synchronize local HTML5 DB (WebSQL Storage, SQLite) with a server (2 way sync) [closed] 【发布时间】:2010-12-17 04:51:10 【问题描述】:

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

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

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

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

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

【问题讨论】:

我不知道是否有任何库,但最简单的方法似乎是存储修改时间戳,并将更改传输到比另一侧的记录更新的记录,并传输自上次同步以来的添加和删除。如果本地时钟和服务器时钟不同步,它可能会发疯,但你会想到一些事情。 -- 作为评论发布,因为它可能不是很有帮助,也没有为您提供答案。 谢谢伊万。你是对的,如果本地和服务器时钟不同步,它可能会很混乱......我刚刚发现:quickconnect.pbworks.com/Using-Enterprise-Synchronization 它说它可以将本地 HTML 5 数据库与服务器中的数据库同步。我需要更深入地了解它,看看它是否可以在 QuickConnect 框架之外运行...... 我找到了另一个解决方案:impel.simulacre.org/blog/… 看起来不错,但您需要使用 Mootools 库和 Impel ORM... CouchDB 怎么样? couchdb.apache.org 主题用于讨论,Stack Exchange 用于问题。 Stack Exchange 曾接受过类似的帖子,但现在不再接受。 【参考方案1】:

我开发了一个名为 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 中有一些例子。同样,欢迎贡献。

【讨论】:

一年后总结一下,您认为这对您的效果如何?我正在寻找适用于浏览器和移动设备的优秀客户端数据库。 WebSQLSync 与超过 25 个生产应用程序(ios 和 Android)运行良好。 WebSQL 真的很棒而且速度很快。它适用于 iOS、Android、Blackberry(我认为是最新版本),当然还有 chrome 和 safari。但它不适用于 IE 和 firefox,因为该 API 已被 W3C 贬值.. 好的,正面和负面都有。感谢您的重述! 除了 localStorage 而不是 WebSQL,你有什么类似的吗?【参考方案2】: 我创建了一个名为 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 对象关系映射器库。您可以在浏览器中使用它,也可以在服务器上使用它(并且您可以在它们之间共享数据模型)。​​”

他们有一个数据库同步模块:DOC of 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/

【讨论】:

嗨 Samuel,js 库对你有用吗? 数据库同步暂时不是我的首要任务,所以我放弃了,等待更标准和更强大的解决方案... 在测试完所有这些之后,我想我会开发自己的小型JS库来同步WebSQL与服务器数据库。它将是一个双同步(本地 服务器)并且没有任何依赖关系。完成后我会在这里发布代码的链接 我已经提交了我自己的名为 WebSqlSync 的同步解决方案的第一个版本:github.com/orbitaloop/WebSqlSync(参见下面的答案) 大家好,我已经启动了一个用于restful 同步的persistencejs 插件。它仍在开发中,但如果有人想检查一下:github.com/robertokl/persistencejs 和一个在服务器/客户端使用 ruby​​ on rails 的工作示例:github.com/robertokl/persistencejs-restfulSync-example

以上是关于将本地 HTML5 DB(WebSQL 存储,SQLite)与服务器同步的最佳方法(2 路同步)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 HTML5 iOS 应用程序中安全地存储数据 - localStorage / WebSQL / IndexedDB 合适吗?

[转]App离线本地存储方案

如何在 HTML5 中将数据存储到数据库中

HTML5的5种存储方式详解

本地存储和离线缓存

javascript 本地数据库存储websql