74

问题:

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

我从 Web 标准的角度来处理这个问题的原因基本上是通过在 HTML5 中编写一次然后跨多个平台工作而不是在 Objective C 和 Java 中编写两次来节省金钱和时间。此外,如果您编写的东西与平台无关,那么您就不会被锁定,也不会在每个人都搬到更新的地方时随船而去。我们为 Windows Mobile 5 编写了一个类似的应用程序,现在它已经没用了,因为那个平台已经死了。

设备上的离线数据库需要是:

  • 快速(响应不到 2 秒)
  • 可能执行连接并与能够查询数据库的其他表建立关系
  • 选择特定范围或标准内的数据,例如根据 GPS 读数通过 x 和 y 坐标。

选项:

HTML5 本地存储:

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

缺点:

  • 即使在高端机器上超过 10,000 行,浏览器也会缓慢爬行。
  • 无法对数据进行复杂的查询以提取所需的数据,因为您必须遍历整个存储并手动搜索它。
  • 可以存储的存储量的限制

网络 SQL 数据库:

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

缺点:

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

索引数据库:

键/值对象存储类似于本地存储,除了索引。

缺点:

  • 在 200,000 行上运行查询很慢(15-18 秒)
  • 无法运行复杂查询
  • 无法与其他表进行联接
  • 主要手机或平板设备不支持,例如 iPad/Android
  • 标准不完整

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

我不确定 Mozilla 和 Microsoft 是如何弃用 Web SQL 数据库标准的,以及为什么 W3C 允许它发生。据说他们之间拥有 77% 的桌面浏览器市场。在高级移动设备上,Mozilla 和 Microsoft 的影响力几乎为零,因为Safari、Opera 和 Android 拥有超过 90% 的市场份额。Mozilla 和 Microsoft 如何规定在移动市场中最有可能使用离线存储的标准应该使用哪种标准没有任何意义。

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(默认情况下)然后是较慢的选项。

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

4

7 回答 7

18

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

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

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

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

于 2012-05-18T10:42:42.600 回答
13

我会检查 CouchBase Lite。它是在 Android 和 iOS 上运行的几乎全功能的CouchDB实现。

iOS

安卓

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

优点:

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

缺点:

  • Key-Value Store - 需要一些时间来适应。
于 2011-10-15T07:56:07.907 回答
6

在为自己的项目寻找解决方案时,我进行了更多研究。看起来这个库很有前途: http: //nparashuram.com/IndexedDBShim/

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

它在最近的 iPad、iPhone 5、Android 4.2.2 上通过了测试。

希望这可以帮助某人。

于 2013-06-06T17:53:12.203 回答
2

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

优点

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

缺点

  • 如果您想在 Android Market 或 iOS Market 中使用它,您必须付费。

我在这里粘贴他们对此的评价:

Corona 包括对所有平台上的 SQLite 数据库的支持。这是基于 iPhone 上的内置 sqlite 支持和 Android 上 SQLite 的编译版本。请注意,这会将 Android 二进制文件的大小增加 300K。

SQLite 适用于所有版本的 Android、iPhone 和 iPad,以及 Corona 模拟器...

于 2011-10-15T15:50:37.227 回答
2

“我见过像草坪椅这样的东西,但我很确定它只允许您默认使用本地存储并回退到其他存储。我想我宁愿它使用 Web SQL(默认情况下)而不是较慢的选项。”

这是可配置的,存储引擎的每个“适配器”都是独立的,您可以将适配器传递给 Lawnchair 构造函数,或者,通过在以下情况下以不同方式连接 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。

于 2012-02-03T14:17:53.427 回答
1

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

我会做以下事情:

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

该解决方案仅在数据库足够简单的情况下才可行。但我认为它可能会起作用——javascript 支持在移动设备上很好。

为了获得灵感,这里有一个 javascript 中的 Btree+ 实现。

要读取本地文件,您将需要文件 API,它可用于访问本地文件。大多数现代浏览器都支持它,甚至是Safari 6。我无法确定当前的 iPhone 浏览器是否支持这个 API。

于 2011-10-15T15:36:32.483 回答
1

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

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

作为 NoSQL 库,连接是手动的,但并非不可能。库中已经内置了关键的连接算法。

于 2013-05-30T15:14:46.343 回答