IndexedDB 是一种低级API,用于客户端存储大量结构化数据(包括, 文件/ blobs)。该API使用索引来实现对该数据的高性能搜索。虽然 Web Storage 对于存储较少量的数据很有用,但对于存储更大量的结构化数据来说,这种方法不太有用。IndexedDB提供了一个解决方案。
这是MDN IndexedDB覆盖面的主要着陆页 - 这里,我们提供了完整的API参考和使用指南, 浏览器支持细节,以及关键概念的一些解释的链接。
注意:IndexedDB API是强大的,但对于简单的情况可能看起来太复杂。如果你更喜欢一个简单的API,请尝试类库,如localForage, dexie.js, 和 ZangoDB,使IndexedDB更方便用户。
关键概念和用法
IndexedDB是一个事务型数据库系统,类似于基于SQL的RDBMS。 然而不同的是它使用固定列表,IndexedDB是一个基于JavaScript的面向对象的数据库。 IndexedDB允许您存储和检索用键索引的对象; 可以存储structured clone algorithm支持的任何对象。 您只需要指定数据库模式,打开与数据库的连接,然后检索和更新一系列事务中的数据。
- 阅读关于 Concepts behind IndexedDB 的更多信息。
- 使用IndexedDB指南,了解如何使用IndexedDB与第一原则异步运行。
- 查找开发人员在离线应用页面上使网络应用离线工作的建议。
此页面从根本上来说是针对该 API 对象技术描述的入口。如果你需要的是一份入门读本,你应该查阅 有关 IndexedDB 的基本概念。至于更多详细信息,请参见 使用 IndexedDB。
IndexedDB 分别为同步和异步访问提供了单独的 API 。同步 API 本来是要用于仅供 Web Workers 内部使用,但是还没有被任何浏览器所实现。异步 API 在 Web Workers 内部和外部都可以使用。
异步 API
异步 API 方法调用完后会立即返回,而不会阻塞调用线程。要异步访问数据库,要调用 window 对象 indexedDB
属性的 open()
方法。该方法返回一个 IDBRequest 对象 (IDBOpenDBRequest);异步操作通过在 IDBRequest 对象上触发事件来和调用程序进行通信。
注意: indexedDB
对象在旧版本的浏览器上是带有前缀的 (在 Gecko < 16的情况下是 mozIndexedDB
属性,Chrome 中是 webkitIndexedDB
,以及IE10 的 msIndexedDB
)。
IDBFactory
提供了对数据库的访问。这是由全局对象indexedDB
实现的接口,因而也是该 API 的入口。IDBCursor
遍历对象存储空间和索引。IDBCursorWithValue
遍历对象存储空间和索引并返回游标的当前值。IDBDatabase
表示到数据库的连接。只能通过这个连接来拿到一个数据库事务。IDBEnvironment
提供了到客户端数据库的访问。它由 window 对象实现。IDBIndex
提供了到索引元数据的访问。IDBKeyRange
定义键的范围。IDBObjectStore
表示一个对象存储空间。IDBOpenDBRequest
表示一个打开数据库的请求。IDBRequest
提供了到数据库异步请求结果和数据库的访问。这也是在你调用一个异步方法时所得到的。IDBTransaction
表示一个事务。你在数据库上创建一个事务,指定它的范围(例如你希望访问哪一个对象存储空间),并确定你希望的访问类型(只读或写入)。IDBVersionChangeEvent
表明数据库的版本号已经改变。
一个早期版本的规范还定义了下面这些现在已经被删除的接口。因为可能会需要对之前编写的代码进行更新,所以我们依然对这些接口进行了文档化:
IDBVersionChangeRequest
表示更改数据库版本号的请求。更改数据库版本的方式已经自此改变了(调用IDBFactory.open()
而不需要再调用IDBDatabase.setVersion()
),并且IDBOpenDBRequest
接口现在具有已经移除的IDBVersionChangeRequest
的功能。IDBDatabaseException
表示在执行数据库操作时可能碰到的异常情况。
规范里面还定义了 API 的同步版本。同步 API 还没有在任何浏览器中得以实现。它原本是要和 WebWorkers 一起使用的。
存储空间限制
一个单独的数据库项目的大小没有限制。然而可能会限制每个 IndexedDB 数据库的大小。这个限制(以及用户界面对它进行断言的方式)在各个浏览器上也可能有所不同:
-
Firefox: 对 IndexedDB 数据库的大小没有限制。在用户界面上只会针对存储超过 50 MB 大小的 BLOB(二进制大对象)请求权限。这个大小的限额可以通过
dom.indexedDB.warningQuota
首选项进行自定义 (定义在 http://mxr.mozilla.org/mozilla-central/source/modules/libpref/src/init/all.js)。 - Google Chrome: 参见 https://developers.google.com/chrome...rage#temporary
示例
网上有一个 Marco Castelluccio 开发的 IndexedDB 能被用来做什么的强大示例,他是 IndexedDB Mozilla DevDerby 的胜出者。 获奖的演示是 eLibri,一个图书馆和电子书阅读器应用程序。
浏览器兼容性
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
---|---|---|---|---|---|
异步 API | 12 webkit | 10 ms | 未实现 | 未实现 | |
同步 API (用于 WebWorkers) |
未实现 | 未实现 See bug 701634 |
未实现 | 未实现 | 未实现 |
Feature | Android | Firefox Mobile (Gecko) | IE Phone | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|
异步 API | 未实现 | 6.0 (6.0) moz | 未实现 | 未实现 | 未实现 |
另外一个浏览器兼容性矩阵请参见: When Can I Use IndexedDB
通过 IndexedDB Polyfill 也有可能在 支持 WebSQL 的浏览器 上使用 IndexedDB。
参见
- 有关 IndexedDB 的一些基本概念
- 使用 IndexedDB
- 在 IndexedDB 中存储照片和文件
- 使用 HTML5 IndexedDB 的简单待办事项列表. Note: This tutorial is based on an old version of the specification and does not work on up-to-date browsers: for example, it still uses the removed
setVersion()
method. - Indexed Database API 规范
- IndexedDB — 使用浏览器存储
- 浏览器的 IndexedDB 支持情况
- IndexedDB 示例
- IndexedDB Polyfill 为仅支持WebSQL 的浏览器(例如移动版的 WebKit)
- JQuery IndexedDB 插件