--- title: IndexedDB slug: Web/API/IndexedDB_API tags: - IndexedDB - IndexedDB API - Object Storage - Workers - localforage translation_of: Web/API/IndexedDB_API ---

{{DefaultAPISidebar("IndexedDB")}}

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

{{AvailableInWorkers}}

注意: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() 方法。该方法返回一个 {{domxref("IDBRequest")}} 对象;异步操作通过在 {{domxref("IDBRequest")}} 对象上触发事件来和调用程序进行通信。

连接数据库

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

接收和修改数据

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

自定义事件接口

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

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

过时的接口

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

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

示例

规范

Specification Status Comment
{{SpecName("IndexedDB 2")}} {{Spec2("IndexedDB 2")}}
{{SpecName('IndexedDB')}} {{Spec2('IndexedDB')}} Initial definition

参见