首页 文章

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

提问于
浏览
74

The problem:

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

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

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

  • 快(响应时间不到2秒)

  • 可能执行连接并与能够查询数据库的其他表 Build 关系

  • 选择特定范围内的数据或标准,例如通过基于GPS读数的x&y坐标 .

Options:

HTML5 local storage:

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

缺点:

  • 即使在高端机器上超过10,000行,浏览器也会慢慢爬行 .

  • 无法对数据执行复杂查询以提取所需数据,因为您必须遍历整个存储并手动搜索它 .

  • 具有可存储的存储量的限制

Web SQL Database:

  • 符合要求 .

  • 快速运行250,000行查询(1-2秒)

  • 可以创建复杂的查询,连接等

  • Safari,Android和Opera支持,因此适用于iOS和Android设备

缺点:

  • 截至2010年11月已弃用

  • 跨目录攻击的安全漏洞 . 这不是一个问题,因为我们不会在共享主机上

IndexedDB:

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

缺点:

  • 在200,000行(15-18秒)上运行查询速度慢

  • 无法运行复杂查询

  • 无法与其他表进行连接

  • 主要手机或平板电脑设备不支持,例如的iPad /安卓

  • 标准未完成

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

我不确定Mozilla和Microsoft如何推荐Web SQL数据库标准,以及为什么W3C会让它发生 . 据称他们之间拥有77%的桌面浏览器市场 . 在先进的移动设备上,Mozilla和微软的影响几乎为零,因为Safari, Opera and Android have over 90% of the market share . Mozilla和微软如何决定在最有可能使用离线存储的移动市场中应该使用哪种标准没有任何意义 .

comments from Mozilla中,为什么他们想要使用IndexedDB而不是主要关于'developer aesthetics'而且他们不会购买它 .

  • 目前提议的标准是劣质的,非常基本的NoSQL实现很慢,甚至不支持人们在数据库中需要的高级功能 . 有许多样板代码来 Build 数据库并获取数据,但是他们声称人们会在其顶部编写一些很好的抽象库,它们将提供更高级的功能 . 截至2011年10月,他们无处可见 .

  • 他们已经弃用了现有的Web SQL标准,该标准实际上可以在主要的移动设备/平板电脑浏览器中实现 . 虽然主流移动浏览器无法提供“新”和“更好”的标准 .

  • 我们作为开发人员应该在接下来的3到5年内使用什么,这时IndexedDB规范可能会变得标准化,具有更多功能,在主要的移动/平板电脑浏览器中实现,并且有一些很好的库可以使事情变得更容易?

W3C应该保持Web SQL数据库标准并行运行,并解决问题 . 它已经支持主要的移动平台,并且运行良好 . 事实上,Mozilla和微软一样是最具竞争力的两家公司桌面浏览器共享能够让这个标准被废弃是非常可疑的,可能被视为阻碍移动网络平台进展的尝试,直到他们能够赶上并提供针对iOS / Safari和Android的竞争解决方案 .

总之,任何人都有我的问题的解决方案,适用于手机/平板电脑设备的iOS / Android . 也许是一个很好的包装器API,它可以在后台使用多个数据库实现并具有查询功能,它允许您选择哪个数据库具有优先级 . 我已经看过像lawnchair这样的东西,但我更喜欢使用Web SQL(默认情况下),然后是较慢的选项 .

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

7 回答

  • 2

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

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

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

    关于WebSQL在2012年被弃用:在撰写本文时,WebSQL仍然拥有95%的设备覆盖率,包括三星SmartTV和亚马逊Kindle . Check out kindle executing WebSQL unit tests with JayData .

  • 18

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

    iOS

    Android

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

    优点:

    • 快速查看引擎,用于查询多行数据 .

    • Dirt简单而强大的复制支持 .

    缺点:

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

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

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

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

    希望这有助于某人 .

  • 2

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

    优点

    • 它需要用Html5存储做一些奇怪的事情

    缺点

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

    我在这里粘贴他们所说的内容:

    Corona包括在所有平台上支持SQLite数据库 . 这是基于iPhone上内置的sqlite支持,以及Android上的SQLite编译版本 . 请注意,这会将Android二进制文件的大小增加300K . SQLite适用于所有版本的Android,iPhone和iPad,以及Corona模拟器......

  • 6

    “我已经看过像草坪车这样的东西,但我很确定它只允许你默认使用本地存储并且回到其他人 . 我想我宁愿使用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包装成一个本机应用程序然后你会有很多选择,但如果你想坚持使用web标准,那么这可能是一个很好的方法,直到我们广泛采用了IndexedDB .

  • 1

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

    我会做以下事情:

    • 以bson或类似的二进制格式存储所有内容 .

    • 在文件中解析并创建索引,然后阅读启动 .

    • 使用javascript查询并从您的(明显离线)Web应用程序中读取大文件 .

    • 分别存储更新的对象 .

    只有数据库足够简单时,此解决方案才可行 . 但我认为它可能有用 - 在移动设备上javascript支持很好 .

    灵感here是javascript中的Btree实现 .

    要读取本地文件,您需要file API,可用于access local files . 大多数现代浏览器都支持它,甚至Safari 6 . 我无法确定当前的iPhone浏览器是否支持此API .

  • 1

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

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

    作为NoSQL库,join是手动的,但并非不可能 . 已经存在密钥连接算法内置库 .

相关问题