IndexedDB

IndexedDB 是一种底层 API,用于在客户端存储大量的结构化数据(也包括文件/二进制大型对象(blobs))。该 API 使用索引实现对数据的高性能搜索。虽然 Web Storage 在存储较少量的数据很有用,但对于存储更大量的结构化数据来说力不从心。而 IndexedDB 提供了这种场景的解决方案。本页面 MDN IndexedDB 的主要引导页 - 这里,我们提供了完整的 API 参考和使用指南,浏览器支持细节,以及关键概念的一些解释的链接。

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

注意:IndexedDB API是强大的,但对于简单的情况可能看起来太复杂。如果你更喜欢一个简单的API,请尝试  localForagedexie.jsPouchDBidbidb-keyvalJsStore 或者 lovefield  之类的库,这些库使 IndexedDB 对开发者来说更加友好。

关键概念和用法

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

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

同步和异步(Synchronous、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)库,大多 API 与 IndexedDB 类似,但做了一些小的改进,让数据库的可用性得到了大大的提升。
  • idb-keyval:使用 IndexedDB 实现的超级简单且小巧的(~600B)基于 Promise 的键值对存储。
  • sifrr-storage:一个非常小的(~2kB)基于 Promise 的客户端键值数据库。基于 IndexedDB、localStorage、WebSQL 和 Cookies 实现。它可以自动选择上述支持的数据库,并按照优先顺序使用。
  • lovefield:Lovefield 是一个用于 Web App 的关系型数据库,使用 JavaScript 编写,可以在不同的浏览器环境中运行,提供了类似 SQL 的 API,速度快、安全且易用。