IndexedDB

IndexedDB是一种低级API,用于客户端存储大量结构化数据(包括, 文件/ blobs)。该API使用索引来实现对该数据的高性能搜索。虽然 Web Storage 对于存储较少量的数据很有用,但对于存储更大量的结构化数据来说,这种方法不太有用。IndexedDB提供了一个解决方案。这是MDN IndexedDB的主要着陆页 - 这里,我们提供了完整的API参考和使用指南,浏览器支持细节,以及关键概念的一些解释的链接。

Note: 此特性在 Web Worker 中可用。

注意:IndexedDB API是强大的,但对于简单的情况可能看起来太复杂。如果你更喜欢一个简单的API,请尝试类库,如localForagedexie.js, 和 ZangoDB,这些使IndexedDB更具工程友好性。

关键概念和用法

IndexedDB是一个事务型数据库系统,类似于基于SQL的RDBMS。 然而,不像RDBMS使用固定列表,IndexedDB是一个基于JavaScript的面向对象的数据库。 IndexedDB允许您存储和检索用索引的对象;可以存储结构化克隆算法支持的任何对象。 您只需要指定数据库模式,打开与数据库的连接,然后检索和更新一系列事务

注意: 正如大多数的web储存解决方案一样,IndexedDB也遵守同源策略。 因此当你在某个域名下操作储存数据的时候,你不能操作其他域名下的数据。

同步和异步Synchronous and asynchronous

使用IndexedDB执行的操作是异步执行的,以免阻塞应用程序。IndexedDB最初包括同步和异步API。同步API仅用于Web Workers已从规范中移除,因为尚不清晰是否需要。但如果Web开发人员有足够的需求,则可以重新引入同步API。

储存限制和回收标准

有许多Web技术在客户端(即本地磁盘)存储各种数据。IndexedDB是最常见的一个。浏览器计算分配给Web数据存储的空间以及达到该限制时要删除的内容的过程并不简单,并且在浏览器之间有所不同。浏览器存储限制和回收标准尝试解释这是如何工作的,至少在火狐的情况下是如此。

接口

为了获取数据库的访问权限,需要在window对象的indexedDB属性上调用open()方法。该方法返回一个 IDBRequest对象;异步操作通过在 IDBRequest对象上触发事件来和调用程序进行通信。

连接数据库

IDBEnvironment
提供IndexedDB功能。它由windowworker实现,这个接口不再是2.0规范的一部分。
IDBFactory
提供数据库访问。这是全局对象indexedDB实现的接口,因此是API的入口。
IDBOpenDBRequest
表示一个打开数据库的请求。
IDBDatabase
表示一个数据库连接。这是在数据库中获取事务的唯一方式。

接收和修改数据

IDBTransaction
表示一个事务。在数据库上创建一个事务,指定作用域(例如要访问的存储对象),并确定所需的访问类型(只读或读写)。
IDBRequest
处理数据库请求并提供对结果访问的通用接口。
IDBObjectStore
表示允许访问通过主键查找的IndexedDB数据库中的一组数据的对象存储区。
IDBIndex
也是为了允许访问IndexedDB数据库中的数据子集,但使用索引来检索记录而不是主键。这有时比使用IDBObjectStore更快
IDBCursor
迭代对象存储和索引。
IDBCursorWithValue
迭代对象存储和索引并返回游标的当前值。
IDBKeyRange
定义可用于从特定范围内的数据库检索数据的键范围。
IDBLocaleAwareKeyRange
定义一个键范围,可用于从特定范围内的数据库中检索数据,并根据为特定索引指定的语言环境的规则进行排序(详见createIndex()的参数)。这个接口不再是2.0规范的一部分。

自定义事件接口

此规范使用以下自定义接口触发事件:

IDBVersionChangeEvent
作为IDBOpenDBRequest.onupgradeneeded事件的处理程序的结果,IDBVersionChangeEvent接口表示数据库的版本已经发生了改变。

过时的接口

规范的早期版本还定义了这些现在已删除的接口。这些文档便于您需要更新以前编写的代码

IDBVersionChangeRequest
表示更改数据库版本的请求。改变数据库版本的方法已经改变了(通过调用IDBFactory.open而非IDBDatabase.setVersion),接口IDBOpenDBRequest现在拥有IDBVersionChangeRequest
IDBDatabaseException 
表示执行数据库操作时可能遇到的异常情况。
IDBTransactionSync
同步版本的IDBTransaction
IDBObjectStoreSync
同步版本的IDBObjectStore
IDBIndexSync
同步版本的IDBIndex
IDBFactorySync
同步版本的IDBFactory
IDBEnvironmentSync
同步版本的IDBEnvironment
IDBDatabaseSync
同步版本的IDBDatabase
IDBCursorSync
同步版本的IDBCursor

使用例程

规范

Specification Status Comment
Indexed Database API Draft Recommendation
Indexed Database API 2.0 Recommendation Initial definition

参见

  • localForage:一个简单名称的Polyfill:客户端数据存储的值语法,它在后台使用IndexedDB,但在不支持IndexedDB的浏览器中回退到WebSQL或localStorage。
  • Dexie.js:IndexedDB的包装器,通过简单的语法,可以更快地进行代码开发。
  • ZangoDB:类似MongoDB的IndexedDB接口,支持MongoDB的大多数熟悉的过滤,投影,排序,更新和聚合功能。
  • JsStore:一个带有SQL语法的IndexedDB包装器。
  • MiniMongo由localstorage支持的客户端内存中的mongodb,通过http进行服务器同步。MeteorJS使用MiniMongo。
  • PouchDB:使用IndexedDB在浏览器中实现CouchDB的客户端。
  • idb:一个微小的(〜1.15k)库,主要反映了IndexedDB的API,但小的改进,使一个很大的区别的可用性。
  • idb-keyval:使用IndexedDB实现的超简单小(~600B)基于Promise的键值存储。