2011年为 iOS/Android 开发 HTML5离线存储解决方案

问题是:

我需要一个与设备无关的(例如 HTML5)解决方案,用于在手机或平板电脑类型的设备(例如 iOS/Android)上离线存储和查询25万多行数据。我的想法是让人们在没有蜂窝数据连接的偏远地区工作,他们需要对这些数据进行查询,并在离线时进行编辑。部分是基于地理位置的,所以如果有资产在他们所在的地区(使用 GPS) ,然后它会显示这些资产,让他们被编辑。当他们返回办公室时,他们可以将数据同步回办公室服务器。

我之所以从 Web 标准的角度来看待这个问题,基本上是为了节省金钱和时间,用 HTML5编写一次,然后在多个平台上工作,而不是用 Objective C 和 Java 编写两次。另外,如果你写的东西是平台不可知的,那么你就不会被锁在里面,也不会在大家都搬到新的平台的时候和船一起沉没。我们曾经为 WindowsMobile5编写过一个类似的应用程序,现在它已经没用了,因为这个平台已经死了。

设备上的脱机数据库需要:

  • 快速(响应时间小于2秒)
  • 可能执行连接并与能够查询数据库的其他表建立关系
  • 在一定范围或标准内选择数据,例如根据 GPS 读数选择 x & y 坐标。

选择:

HTML5本地存储:

对于少量 < 5,000键/值的数据,如果将其转换为 JSON,甚至可以在其中存储数组/对象。

缺点:

  • 对于超过10,000行,即使在高端机器上,浏览器也会 慢得像爬一样。
  • 不能对数据进行复杂的查询来提取所需的数据,因为必须遍历整个存储并手动搜索。
  • 可存储的存储量的限制

网络 SQL 数据库:

  • 符合要求。
  • 对250,000行(1-2秒)快速运行查询
  • 可以创建复杂的查询、连接等
  • 由 Safari、 Android 和 Opera 支持,所以可以在 iOS 和 Android 设备上工作

缺点:

  • 截至2010年11月已弃用
  • 跨目录攻击的安全漏洞。不是真正的问题,因为我们不会在共享主机上

IndexedDB:

键/值对象存储与本地存储类似,但带有索引。

缺点:

  • 对200,000行(15-18秒)运行查询速度较慢
  • 无法运行复杂查询
  • 不能与其他表进行联接
  • 主机或平板电脑(例如 iPad/Android)不支持
  • 标准未完成

这就留下了实现已废弃的 Web SQL 方法的唯一选择,该方法可能只能再工作一年左右。IndexedDB 和本地存储目前无法使用。

我不知道 Mozilla 和微软是如何废弃 Web SQL 数据库标准的,也不知道 W3C 为什么会让这种情况发生。据说他们占据了桌面浏览器市场77% 的份额。在先进的移动设备上,Mozilla 和微软几乎没有像 Safari,Opera 和 Android 占有超过90% 的市场份额那样的影响力。Mozilla 和微软如何决定哪些标准应该在移动市场上使用,哪些地方最有可能使用离线存储是没有任何意义的。

来自 Mozilla 的评论中,他们为什么要使用 IndexedDB,主要是关于“开发者美学”,他们不喜欢在 JavaScript 中运行 SQL 的想法。我不信。

  1. 目前提出的标准是劣质的,是一个非常基本的 NoSQL 实现,速度很慢,甚至不支持人们在数据库中需要的高级特性。有很多样板代码来建立数据库和获取数据,但是他们声称人们会在上面编写一些很好的抽象库来提供更高级的特性。截至2011年10月,他们已经消失得无影无踪。

  2. 他们已经否定了现有的 Web SQL 标准,该标准实际上可以在主要的移动/平板浏览器中实现。然而他们的“新”和“更好”的标准在主要的移动浏览器中并不可用。

  3. 作为开发人员,我们在未来3-5年里应该使用什么? 届时 IndexedDB 规范可能会开始标准化,在主要的移动/平板电脑浏览器中实现更多的功能,而且还有一些不错的库可以让事情变得更简单?

W3C 应该保持 Web SQL 数据库标准并行运行,并仅仅修复这些问题。它已经支持主要的移动平台,而且运行良好。Mozilla 和微软作为桌面浏览器市场份额最大的两家公司能够废除这一标准,这一事实令人怀疑,并且可能被视为阻碍移动网络平台进步的一种尝试,直到它们能够赶上并提供与 iOS/Safari 和 Android 竞争的解决方案。

总而言之,是否有人能为我的问题找到一个解决方案,可以在 iOS/Android 手机/平板电脑设备上使用。也许是一个很好的包装器 API,它可以在后台使用具有查询功能的多个数据库实现,并且允许您选择哪个数据库具有优先级。我见过像 躺椅这样的东西,但是我很肯定它只允许您默认使用本地存储,并且回到其他的存储。我认为我宁愿它使用 Web SQL (默认情况下) ,而不是较慢的选项。

非常感谢您对解决方案的任何帮助,谢谢!

14715 次浏览

我想看看 CouchBase Lite,它是一个在 Android 和 iOS 上运行的 CouchDB的几乎全功能的实现。

IOS

仿生人

如果你把你的应用程序封装在类似 PhoneGap的东西中,你可以为这两个平台创建原生的 HTML 5应用程序,你只需要做一点点 Android/iOS 特定的编程来实现 CouchDB。

优点:

  • 用于跨多行数据查询的快速视图引擎。
  • 内置简单而强大的复制支持。

缺点:

  • 键-价值存储-需要一些时间来适应。

为什么不用 javascript 编写一个简单的存储引擎(包括“基于标准的”部分) ?显然,你不需要任何非常花哨的东西,所以不需要太多的努力就可以让它工作。

我会做以下事情:

  • 以 bson 或类似的二进制格式存储所有内容。
  • 解析和创建文件中的索引,并在启动时读取。
  • 使用 javascript 进行查询,并从(显然是脱机的) Web 应用程序的大文件中读取。
  • 单独存储更新的对象。

只有当数据库足够简单时,这种解决方案才是可行的。但是我认为它可能会起作用—— javascript 支持在移动设备上是很好的。

作为启发,给你是 javascript 中的 Btree + 实现。

要读取本地文件,您将需要 文件 API,它可以用于 访问本地文件。大多数现代浏览器都支持它,甚至 Safari 6也是如此。但是我还不能确定现在的 iPhone 浏览器是否支持这个 API。

我会告诉你使用 科罗娜。它是一个用于支持 SQLite 的跨移动应用程序的私有平台。

优点

  • 它很简单,并且对 SQLite 有很强的支持,而且不需要对 Html5存储做奇怪的事情

缺点

  • 如果你想在 Android 市场或者 iOS 市场使用它,你必须付费。

我把他们说的贴在这里:

Corona 包括对所有平台上的 SQLite 数据库的支持 基于 iPhone 内置的 sqlite 支持,并编译了一个 注意,这增加了 Android 二进制30万。

SQLite 可以在 Android、 iPhone 和 iPad 的所有版本中使用,如 以及科罗娜模拟器。

“我见过一些类似于躺椅的东西,但是我很确定它只允许你默认使用本地存储,然后回到其他存储设备上。我认为我宁愿它使用 Web SQL (默认情况下) ,而不是更慢的选项。”

这是可配置的,存储引擎的每个“适配器”都是自包含的,你可以将一个适配器传递给 Lawnbench 构造器,或者,在创建库时通过连接不同的 javascript 文件来改变它回落到其他存储选项的顺序。例如,对于 indexed-db,然后回到 sqlite,然后齿轮 sqlite:

git clone https://github.com/brianleroux/lawnchair.git
cd lawnchair
cat src/Lawnchair.js src/adapters/indexed-db.js src/adapters/webkit-sqlite.js src/adapters/gears-sqlite.js > my_lawnchair.js

当然,正如其他答案所表明的那样,你可以使用 phonegap 等将你的 html5包装成一个本地应用程序,然后你将有很多选择,但是如果你想坚持网络标准,那么这可能是一个很好的方法,直到我们得到广泛采用 IndexedDB。

我建议检查一下 JayData库,它的确切用途是为移动设备创建一个与存储无关的数据访问层。JayData 提供了一个支持 JavaScript 语言查询(JSLQ)和 JavaScript CRUD 的抽象层,让你可以用完全相同的方式处理不同的离线和在线数据存储类型。JayData 支持处理复杂的实体以及本地或远程的实体关系。

在编写本文时,JayData 支持以下存储或协议: webSQL (sqLite)/IndexedDB/OData/YQL/FBQL。

不同系统提供不同的存储引擎的特殊问题可以通过 JayData 的提供者回退特性轻松解决: 它将使用它能找到的任何存储层,同时仍然为消费者代码提供相同的 API。

关于 WebSQL 在2012年被废弃的问题: 在撰写本文时,WebSQL 仍然有95% 的设备覆盖率,包括三星的 SmartTV 和亚马逊的 Kindle。使用 JayData 检查 kindle 执行的 WebSQL 单元测试.

值得一看我的开源库 https://bitbucket.org/ytkyaw/ydn-db/wiki/Home

用于 Indexeddb、 WebDatabase (WebSQL)和 WebStorage (localStorage)存储机制的 Javascript 数据库模块,支持版本迁移、高级查询和事务。

作为 NoSQL 库,join 是手动的,但并非不可能。

在为自己的项目寻找解决方案时,我做了更多的研究。 看起来这个图书馆相当有前途: http://nparashuram.com/indexeddbshim/

它允许在后台使用具有 WebSQL 的 IndexedDB API。

它的测试通过了最近的 iPad,iPhone5,Android 4.2。

希望这对谁有帮助。