问题:
我需要一个与设备无关的(如HTML5)解决方案,用于在手机或平板设备(如iOS/Android)上离线存储和查询250,000+行数据。我的想法是,我让人们在没有任何蜂窝数据连接的偏远地区工作,他们需要对这些数据进行查询,并在离线时进行编辑。部分原因是它将基于地理位置,所以如果在他们所在的地区有资产(使用GPS),那么它将显示这些资产并让它们被编辑。当他们回到办公室时,他们可以将数据同步回办公室服务器。
我从web标准的角度来处理这个问题的原因基本上是通过在HTML5中编写一次,然后它可以在多个平台上运行,而不是在Objective C和Java中编写两次,从而节省金钱和时间。此外,如果你编写的东西是平台无关的,那么你就不会被锁定,也不会在每个人都转向新平台时随波而下。我们曾经为Windows Mobile 5编写过一个类似的应用程序,现在它已经没用了,因为这个平台已经死了。
设备上的离线数据库需要为:
- 快速(响应小于2秒)
- 可能执行连接并与其他能够查询数据库的表建立关系
- 在一定范围或标准内选择数据,例如按x &基于GPS读数的y坐标。
选项:
HTML5本地存储
对于少量数据<5,000个键/值很好,如果将其转换为JSON,您甚至可以在其中存储数组/对象。
缺点:
- 对于超过10,000行,即使在高端机器上,浏览器也会慢如蜗牛
- 不能对数据进行复杂的查询以提取你想要的数据,因为你必须遍历整个存储并手动搜索它。
- 可存储的存储量限制
Web SQL数据库:
- 满足要求
- 快速运行250000行查询(1-2secs)
- 可以创建复杂的查询,连接等
- 支持Safari, Android和Opera,因此可以在iOS和Android设备上工作
缺点:
- 2010年11月已弃用
- 跨目录攻击的安全漏洞。这不是一个真正的问题,因为我们不会在共享主机
IndexedDB:
键/值对象存储,与本地存储类似,只是增加了索引。
缺点:
- 在200,000行上运行查询太慢(15-18secs)
- 无法运行复杂查询
- 不能与其他表连接
- 不支持主手机或平板设备,如iPad/Android
- 标准未完成
这就留下了实现已弃用的Web SQL方法的唯一选择,该方法可能只能再工作一年左右。IndexedDB和本地存储目前无法使用。
我不知道Mozilla和微软是如何让Web SQL数据库标准被弃用的,也不知道为什么W3C会让它发生。据推测,这两家公司占据了桌面浏览器市场77%的份额。在高级移动设备上,Mozilla和微软的影响力几乎为零,而Safari、Opera和Android占据了90%以上的市场份额。Mozilla &微软可以决定移动市场应该使用哪种标准,而离线存储最有可能被使用的地方没有任何意义。
在Mozilla关于为什么他们想用IndexedDB代替的评论中,主要是关于"开发者美学",他们不喜欢在JavaScript中运行SQL的想法。我才不信呢。
-
目前提出的标准是较差的,是一个非常基本的NoSQL实现,速度很慢,甚至不支持人们在数据库中需要的高级功能。有很多样板代码用来建立数据库和获取数据,但他们声称人们会在它的基础上编写一些很好的抽象库,以提供更高级的功能。截至2011年10月,他们已无处可寻。
-
他们已经弃用了现有的Web SQL标准,该标准实际上是在主要的移动/平板电脑浏览器中实现的。然而他们的"新的"one_answers"更好的"标准在主要的移动浏览器中是不可用的。
-
在接下来的3-5年里,当IndexedDB规范可能被标准化,有更多的功能,在主要的移动/平板电脑浏览器中实现,并且有一些很好的库使事情变得更容易时,我们作为开发者应该使用什么?
W3C应该保持Web SQL数据库标准并行运行,只是修复问题。它已经支持主要的移动平台,并且运行得非常好。事实上,Mozilla和微软这两家拥有最多桌面浏览器市场份额的公司能够取消这一标准,这是非常令人怀疑的,可以看作是他们试图阻碍移动网络平台的发展,直到他们能够赶上并提供与iOS/Safari和Android竞争的解决方案。
总之,有没有人有一个解决我的问题,将适用于iOS/Android手机/平板设备的解决方案。也许是一个很好的包装器API,它可以在后台使用多个具有查询功能的数据库实现,并允许您选择哪个数据库具有优先级。我见过lawnchair之类的东西,但我很确定它默认只允许您使用本地存储,然后退回到其他存储。我想我宁愿使用Web SQL(默认),而不是更慢的选项。
任何帮助的解决方案非常感激,谢谢!
我建议您查看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单元测试。
我会选择CouchBase Lite。它是CouchDB的一个几乎全功能的实现,可以在Android和iOS上运行。
iOS
Android
如果你用PhoneGap之类的东西包装你的应用,你可以为两个平台创建原生HTML 5应用,你只需要做一点Android/iOS特定的编程来实现CouchDB。
优点:
- 快速视图引擎,用于跨多行数据查询。 简单而强大的复制支持。
缺点:
- 键值存储-需要一些时间来适应。
在为自己的项目寻找解决方案时,我做了更多的研究。看起来这个库很有前途:http://nparashuram.com/IndexedDBShim/
它允许使用IndexedDB API在后台拥有WebSQL。
在最新的iPad, iPhone 5, Android 4.2.2上测试通过。
希望这能帮助到一些人。
我会告诉你使用Corona。它是一个私有平台,用于支持SQLite的跨移动应用程序。
优点
- 这很容易,有一个很大的支持SQLite,不需要做奇怪的事情与Html5存储
弊
- 如果你想在Android市场或iOS市场使用它,你必须付费。
我把他们说的粘贴在这里:
Corona支持所有平台上的SQLite数据库。这是基于iPhone内置的sqlite支持,并编译Android上的SQLite版本。的大小Android binary by 300K.
SQLite可以在Android、iPhone和iPad的所有版本中使用
"我见过像lawnchair这样的东西,但我很确定它只允许您默认使用本地存储,并回落到其他。我想我宁愿使用Web SQL(默认情况下),而不是更慢的选项。"
这是可配置的,存储引擎的每个"适配器"都是自包含的,你可以将适配器传递给Lawnchair构造器,或者,或者,在创建库时通过不同的连接javascript文件来改变它回落到其他存储选项的顺序。例如,对于索引数据库,然后返回到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打包到本地应用程序中,这样你就有了很多选择,但如果你想坚持web标准,那么这可能是一个很好的方法,直到我们广泛采用IndexedDB。
为什么不用javascript编写一个简单的存储引擎(它涵盖了"基于标准"的部分)?显然,你不需要非常花哨的东西,所以不应该花太多的精力让它工作。
我会这样做:
- 将所有内容存储为bson或类似的二进制格式。
- 在文件中解析和创建索引,并在启动时读取。
- 使用javascript查询并从你的(显然是离线的)web应用程序中读取大文件。
- 单独存储更新后的对象
此解决方案仅在数据库足够简单的情况下可行。但我认为它可能会奏效——javascript支持在移动设备上是很好的。
这里是一个Btree+在javascript中的实现。
要读取本地文件,您需要文件API,该API可用于访问本地文件。大多数现代浏览器都支持它,甚至包括Safari 6。我还不能确定当前的iPhone浏览器是否支持这个API。
值得看看我的开源库https://bitbucket.org/ytkyaw/ydn-db/wiki/Home
Javascript数据库模块,用于Indexeddb, WebDatabase (WebSQL)和WebStorage (localStorage)存储机制,支持版本迁移,高级查询和事务。
作为NoSQL库,连接是手动的,但并非不可能。库中已经内置了键连接算法。