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

zua*_*auz 74 javascript html5 web-sql indexeddb jaydata

问题:

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

我从Web标准的角度来看这个问题的原因基本上是通过在HTML5中编写一次来节省金钱和时间,然后它可以跨多个平台工作,而不是在Objective C和Java中编写两次.此外,如果你写的是平台不可知的东西,那么你就不会被锁定,并且当每个人都搬到新的船上时,不要随船离开.我们有一个类似的应用程序为Windows Mobile 5编写,现在它没用,因为该平台已经死了.

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

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

选项:

HTML5本地存储:

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

缺点:

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

Web SQL数据库:

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

缺点:

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

IndexedDB的:

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

缺点:

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

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

我不确定Mozilla和Microsoft如何推荐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(默认情况下),然后使用较慢的选项.

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

Pet*_*tai 18

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

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

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

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

  • @zuallauz我刚刚做了这样的基准测试.从250K项目中获取5-10个项目,使用Android nexus 2在websql上花费了60ms,在使用Windows Phone的Lumia 920上花了25ms.(IndexedDB肯定更快). (2认同)

rwi*_*ams 13

我会结账CouchBase Lite.它是在Android和iOS上运行的近乎全功能的CouchDB实现.

iOS版

Android的

如果您将应用程序包装在PhoneGap之类的内容中,您可以为这两个平台创建原生HTML 5应用程序,并且您只需执行一些Android/iOS特定编程即可实现CouchDB.

优点:

  • 快速查看引擎,用于查询多行数据.
  • 简单而强大的复制支持烘焙.

缺点:

  • 键值存储 - 需要一些时间来习惯.


KIR*_*KIR 6

我在为自己的项目寻找解决方案时做了一些研究.看起来这个库很有前途:http://nparashuram.com/IndexedDBShim/

它允许在幕后使用具有WebSQL的IndexedDB API.

它的测试通过最近的iPad,iPhone 5,Android 4.2.2.

希望这有助于某人.