使用 IndexedDB API 的今天 - IndexedDB 填充

这是一篇由 Parashuram Narasimhan 撰写的客座文章,介绍了如何使用当今的 IndexedDB。

使用本文中提到的填充,Web 开发人员可以开始在他们的应用程序中使用 IndexedDB API,并支持更广泛的浏览器。

IndexedDB API 已发展成为一项稳定的规范,并得到了主要浏览器供应商的支持。但是,该规范仍然 并非所有浏览器都支持,这使得在生产环境中使用它变得更加困难。支持该规范的浏览器之间在实现上也存在一些有趣的差异。本文探讨了几个可以用来使开发人员能够跨不同浏览器使用 IndexedDB 的填充。

使用 WebSql 的填充

WebSql 是浏览器中第一个数据存储规范之一,并得到一些不支持 IndexedDB 实现的浏览器的支持。但是,该规范不再处于主动维护状态。如文档中所述:“它曾经在 W3C 建议跟踪中,但规范工作已停止。该规范陷入了僵局:所有感兴趣的实现者都使用了相同的 SQL 后端(Sqlite),但我们需要多个独立的实现才能沿标准化路径进行。”

这个 使用 WebSql 的填充 利用 WebSQL 实现来公开 IndexedDB API。要使用填充,只需链接或包含 indexeddb.shim.js 文件。

填充将 window.indexedDB 赋值为 window.mozIndexedDB、window.webkitIndexedDB 或 window.msIndexedDB;如果其中任何一个实现可用。如果没有任何实现可用,填充会将“window.shimIndexedDB” 赋值给 window.indexedDB。因此,Web 应用程序可以将 window.indexedDB 作为所有数据库操作的起点。在内部,填充使用 WebSql 表来存储对象存储数据,并且大量借鉴了 Firefox 中的 IndexedDB 实现。例如,它有单独的表和数据库来维护数据库版本的记录,或者对象存储定义 (IDBObjectStoreParameters) 的值。有关内部的更多实现细节,请参阅 关于它的博客文章

该填充经过测试,可与各种 IndexedDB 库配合使用,例如 PouchDBLINQ2IndexedDBJQuery-IndexedDBDB.JS。由于它利用了 WebSql,因此应用程序可以在 Opera 和 Safari 等 Web 浏览器上,以及在 iPad/iPhone 上的 Safari 等移动浏览器或 Cordova 等支持 WebSql 的嵌入式浏览器的移动开发平台上编写符合 IndexedDB API 的代码。

它是在 Javascript 中实现的,并且正在开发中。请注意,它可能无法完全符合规范,如果您发现问题,您可以 提交错误报告 或向 源代码库 发送拉取请求。

用于 setVersion 的填充

IndexedDB 规范的早期版本使用“setVersion”调用来更改 IndexedDB 数据库的版本。后来,它被修改为更易于使用的“onupgradeneeded”回调。尽管 Internet Explorer 和 Firefox 支持较新的“onupgradeneeded”来启动用于创建或删除 objectStores 和索引的数据库版本更改,但 Google Chrome (22.0.1194.0 canary) 仍然使用较旧的 setVersion。

所有浏览器都将很快使用较新的“onupgradeneeded”方法;在此之前,这个简单的 用于 setVersion 的填充 使您能够使用 IndexedDB API 和 onupgradeneeded 方法。

填充使用 openReqShim() 调用替换 indexeddb.open() 调用。openReqShim() 调用会调用 setVersion(),然后将其转换为“onupgradeneeded”回调(如果只支持“setVersion()”)。如果实现支持“onupgradeneeded”,则 openReqShim() 只是对 indexeddb.open 方法的透明调用。因此,要使用此填充,应将 indexeddb.open() 调用替换为 openReqShim() 调用。

关于 Parashuram Narasimhan

Parashuram Narasimhan 是 Sneekpeeq 的程序员。在 Sneekpeeq 之前,他是微软 SQLCE 的高级项目经理,负责 IndexedDB 的实现和规范。他编写了 Jquery IndexedDB 插件(用于 IndexedDB 的查询层),并且正在开发用于 IndexedDB 的 WebSql 填充。他还喜欢在 Web 中玩弄最新的 HTML 功能及其安全影响。在空闲时间,他在 http://nparashuram.com/projects 上进行黑客攻击,并在 http://blog.nparashuram 上发布结果。他也是 Mozilla Firefox 的“狂热”粉丝,从版本 1 开始就一直使用它作为他的主要浏览器。

更多由 Parashuram Narasimhan 撰写的文章…


8 条评论

  1. Josh Matthews

    我还发现 IDBWrapper 库是用于类似目的的不错的跨浏览器工具(它也恰好将一些 IndexedDB 怪异之处隐藏在漂亮的界面后面):http://jensarps.github.com/IDBWrapper/

    2012 年 7 月 31 日 下午 1:59

    1. Robert Nyman

      很棒,感谢您的提示!

      2012 年 7 月 31 日 下午 2:13

  2. kristof degrave

    您好,

    只想说明 linq2indexeddb 框架支持所有主要版本 + IndexedDB 规范的旧版本。感谢填充,甚至包括 Websql 浏览器。

    它使用 jQuery 承诺来提供一个简单而熟悉的界面来处理 IndexedDB API 的异步调用。

    最后,它甚至支持 Windows 8 开发 + 用于调试目的的查看器。(使您能够在调试时查看 IndexedDB 内部)

    http://linq2indexeddb.codeplex.com

    问候,kristof

    2012 年 7 月 31 日 下午 11:23

    1. Robert Nyman

      很高兴听到这个消息,谢谢!

      2012 年 8 月 1 日 上午 12:52

  3. Ido Green

    您是否知道 IndexedDB 适配器到 Lawnchair (= http://brian.io/lawnchair/adapters/ ) 在“生产”时是否稳定?

    2012 年 8 月 1 日 下午 12:13

  4. Parashuram

    如果您查看 Lawnchair IndexedDB 适配器的源代码,它看起来写得相当不错 - https://github.com/brianleroux/lawnchair/blob/master/src/adapters/indexed-db.js

    它支持 setVersion 和 onupgradeneed,因此将在 Chrome 和 Safari 上运行。它还使用 READ_WRITE 等常量来进行事务处理,使其在规范的最新更改(其中数字被替换为字符串常量,例如“readonly”)中安全。但是,浏览器将来可能会删除这些常量,可能需要升级库。

    2012 年 8 月 2 日 下午 3:00

  5. C. Scott Ananian

    我一直在努力更新 Lawnchair 以更好地使规范生效。请参阅 http://github.com/cscott/lawnchair(indexdb-wip 分支),尽管我的工作可能会很快上传到上游。

    2012 年 10 月 16 日 下午 3:53

    1. Robert Nyman

      太好了,感谢您的提醒!

      2012 年 10 月 16 日 下午 10:37

本文的评论已关闭。