在2011年开发适用于iOS / Android的HTML5离线存储解决scheme

问题:

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

我从Web标准的angular度来看待这个问题的原因基本上是通过在HTML5中编写一次而节省金钱和时间,然后跨多个平台工作,而不是在Objective C和Java中编写两次。 另外,如果你写的东西是平台不可知的,那么你就不会被locking在船上,而当每个人都移动到新船上的时候,也不会停下来。 我们有一个为Windows Mobile 5编写的类似的应用程序,现在没用了,因为这个平台已经死了。

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

  • 快(2秒以下的响应)
  • 可能执行连接并与其他能够查询数据库的表有关系
  • select一定范围内的数据或标准,例如基于GPS读数的x和y坐标。

选项:

HTML5本地存储:

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

缺点:

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

Web SQL数据库:

  • 满足要求。
  • 快速运行250,000行查询(1-2secs)
  • 可以创build复杂的查询,连接等
  • 由Safari,Android和Opera支持,因此可以在iOS和Android设备上运行

缺点:

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

IndexedDB的:

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

缺点:

  • 慢速运行一个查询200,000行(15-18secs)
  • 无法运行复杂的查询
  • 无法与其他表连接
  • 不受主要手机或平板电脑设备的支持,例如iPad / Android
  • 标准不完整

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

我不确定Mozilla和Microsoft如何获得Web SQL数据库标准,以及W3C为什么会这样做。 据说他们之间有77%的桌面浏览器市场。 在先进的移动设备上,Mozilla和微软几乎没有影响,因为Safari,Opera和Android的市场份额超过90% 。 如何Mozilla和微软可以决定哪个标准应该在移动市场中使用,哪个离线存储最有可能被使用,这没有任何意义。

在Mozilla的评论中,他们为什么要使用IndexedDB而不是“开发人员美学”,他们不喜欢在JavaScript中运行SQL的想法。 我不买它。

  1. 目前提出的标准是较差的,是一个非常基本的NoSQL实现,速度很慢,甚至不支持人们在数据库中需要的高级function。 有很多样板代码来build立数据库和获取数据,但是他们声称人们会在顶部写一些不错的抽象库来提供更高级的function。 截至2011年10月,他们无处可见。

  2. 他们已经弃用了现有的Web SQL标准,这个标准实际上在主要的移动/平板电脑浏览器中起作用。 而他们的“新”和“更好”标准在主stream的移动浏览器中不可用。

  3. 我们开发人员应该在未来3 – 5年内使用什么样的技术,那就是IndexedDB规范可能会被标准化,具有更多的function,在主要的移动/平板电脑浏览器中实现,还有一些好的库可以让事情变得更简单。

W3C应该保持Web SQL数据库标准并行运行,并解决问题。 它已经支持主要的移动平台,并且工作得很好。 Mozilla和微软作为桌面浏览器份额最多的两家玩家能够获得这个标准的事实相当可疑,可以被看作是阻碍移动networking平台进步的一个尝试,直到他们能够赶上和提供针对iOS / Safari和Android的竞争解决scheme。

总之有没有人有我的问题的解决scheme,适用于手机/平板电脑设备的iOS / Android的工作。 也许一个很好的包装API,可以在后台使用多个数据库实现查询function,它可以让你select哪个数据库有优先权。 我曾经见过像lawnchair那样的东西,但是我敢肯定,它只能让你默认使用本地存储,并且可以回到其他的地方。 我想我宁愿使用Web SQL(默认情况下),然后select较慢的选项。

任何解决scheme的帮助非常感谢,谢谢!

我build议检出JayData库,这实际上是为移动设备创build存储不可知的数据访问层的确切目的。 JayData提供了一个具有JavaScript语言查询(JSLQ)和JavaScript CRUD支持的抽象层,让您以不同的离线和在线数据存储types完全相同的方式进行工作。 JayData支持处理复杂的实体以及本地或远程的实体关系。

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

您提供不同存储引擎的不同系统的特定问题可以通过JayData的提供商回退function轻松解决:它将使用它可以find的任何存储层,同时仍然向消费者代码提供相同的API。

以至于到2012年WebSQL被弃用:在写这篇文章的时候还是有三星SmartTV和亚马逊Kindle的95%设备覆盖率的WebSQL。 看看kindle用JayData执行WebSQLunit testing 。

我会检查CouchBase精简版。 这是一个在Android和iOS上运行的CouchDB的全function实现。

iOS版

Android的

如果您将应用程序封装在PhoneGap之类的应用程序中,则可以为这两种平台创build本机HTML 5应用程序,而只需执行一小部分Android / iOS特定的编程即可实施CouchDB。

优点:

  • 快速查看引擎,用于查询多行数据。
  • 在简单和强大的复制支持烤出来。

缺点:

  • 键值存储 – 需要一些时间才能习惯。

我在为自己的项目寻找解决scheme的同时做了更多的研究。 它看起来像这个图书馆是相当有前途的: http : //nparashuram.com/IndexedDBShim/

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

这是testing通过近期的iPad,iPhone 5,Android 4.2.2。

希望这有助于某人。

我会告诉你使用电晕 。 这是一个用于交叉移动应用程序的私有平台,它支持SQLite。

优点

  • 这很容易,对SQLite有很大的支持,不需要用Html5存储做一些奇怪的事情

缺点

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

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

Corona在所有平台上都支持SQLite数据库。 这是基于iPhone上的内置sqlite支持以及Android上的SQLite编译版本。 请注意,这会将Android二进制文件的大小增加30万。

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

“我已经看到了一些像lawnchair这样的东西,但是我确定它只允许你默认使用本地存储,并且可以使用本地存储,但是我想我宁愿使用Web SQL(默认情况下),然后select较慢的选项“。

这是可configuration的,存储引擎的每个“适配器”都是独立的,您可以将一个适配器传递给Lawnchair的构造函数,或者,可以通过不同的方式连接javascript文件来改变其返回到其他存储选项的顺序。创build图书馆。 例如索引数据库,然后回落到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 

当然,正如其他答案所build议的那样,您可以使用phonegap等将您的html5封装到本机应用程序中,然后您将有很多选项,但是如果您想坚持使用Web标准,那么这可能是一种很好的方法我们已经被广泛采用了IndexedDB。

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

我会做以下几点:

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

这个解决scheme只有在数据库足够简单的情况下才可行。 但我认为它可能工作 – JavaScript支持在移动设备上是好的。

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

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

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

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

作为NoSQL库,连接是手动的,但不是不可能的。 库中已经有了关键的连接algorithm。