indexedDB 是用于客户端存储大量结构化数据(包括文件/blob)的低级 API。此 API 使用索引来启用对这些数据的高性能搜索。虽然Web 存储对于存储少量数据很有用,但它对于存储大量结构化数据的用处不大。IndexedDB 提供了一个解决方案。这是 MDN 的 IndexedDB 覆盖范围的主要登录页面——在这里我们提供了指向完整 API 参考和使用指南、浏览器支持详细信息以及关键概念的一些解释的链接。
注意:此功能在Web Workers中可用
注意: IndexedDB API 功能强大,但对于简单的情况可能看起来过于复杂。如果您更喜欢简单的 API,请尝试另请参阅部分中的库,这些库使 IndexedDB 对程序员更友好。
关键概念和用法
IndexedDB 是一个事务性数据库系统,类似于基于 SQL 的 RDBMS。然而,与使用固定列表的基于 SQL 的 RDBMS 不同,IndexedDB 是一个基于 JavaScript 的面向对象的数据库。IndexedDB 允许您存储和检索使用键索引的对象;可以存储结构化克隆算法支持的任何对象。您需要指定数据库模式,打开与数据库的连接,然后在一系列事务中检索和更新数据。
- 阅读有关IndexedDB 关键特征和基本术语的更多信息。
- 通过我们的使用 IndexedDB指南从第一原则学习异步使用 IndexedDB。
- 将用于离线存储数据的 IndexedDB 与用于离线存储资产的 Service Worker 相结合,如使 PWA 与 Service Worker 离线工作中所述。
注意:与大多数 Web 存储解决方案一样,IndexedDB 遵循同源策略。因此,虽然您可以访问域内存储的数据,但不能访问不同域中的数据。
同步和异步
使用 IndexedDB 执行的操作是异步完成的,以免阻塞应用程序。
存储限制和驱逐标准
有许多 Web 技术可以在客户端(即本地磁盘上)存储一种或另一种数据。IndexedDB 是最常被谈论的。浏览器计算出分配给 Web 数据存储的空间量以及达到该限制时要删除的内容的过程并不简单,并且在不同浏览器之间有所不同。浏览器存储限制和驱逐标准试图解释这是如何工作的,至少在 Firefox 中是这样。
接口
要访问数据库,请调用窗口对象open()
的indexedDB
属性。该方法返回一个对象;异步操作通过触发对象上的事件与调用应用程序进行通信。IDBRequest
IDBRequest
连接到数据库
IDBFactory
- 提供对数据库的访问。这是由全局对象实现的接口,
indexedDB
因此是 API 的入口点。 IDBOpenDBRequest
- 表示打开数据库的请求。
IDBDatabase
- 表示与数据库的连接。这是在数据库上获取事务的唯一方法。
检索和修改数据
IDBTransaction
- 表示交易。您在数据库上创建事务,指定范围(例如要访问的对象存储),并确定所需的访问类型(只读或读写)。
IDBRequest
- 处理数据库请求并提供对结果的访问的通用接口。
IDBObjectStore
- 表示允许访问 IndexedDB 数据库中的一组数据的对象存储,通过主键查找。
IDBIndex
- 还允许访问 IndexedDB 数据库中的数据子集,但使用索引来检索记录而不是主键。这有时比使用
IDBObjectStore
. IDBCursor
- 迭代对象存储和索引。
IDBCursorWithValue
- 遍历对象存储和索引并返回游标的当前值。
IDBKeyRange
- 定义一个键范围,可用于从特定范围内的数据库中检索数据。
IDBLocaleAwareKeyRange
非标- 定义一个键范围,可用于从特定范围内的数据库中检索数据,根据为特定索引指定的区域设置规则进行排序(请参阅
createIndex()
's optionalParameters .)。此接口不是 2.0 规范的一部分。
自定义事件接口
此规范使用以下自定义接口触发事件:
IDBVersionChangeEvent
- 该
IDBVersionChangeEvent
接口指示数据库的版本已更改,这是IDBOpenDBRequest.onupgradeneeded
事件处理函数的结果。
例子
规格
规格 |
---|
索引数据库 API 3.0 |
也可以看看
- localForage:一个为客户端数据存储提供简单名称:值语法的 Polyfill,它在后台使用 IndexedDB,但在不支持 IndexedDB 的浏览器中回退到 Web SQL(已弃用)和 localStorage。
- Dexie.js:IndexedDB 的包装器,通过漂亮、简单的语法允许更快的代码开发。
- ZangoDB : IndexedDB 的类似 MongoDB 的接口,支持 MongoDB 的大多数熟悉的过滤、投影、排序、更新和聚合功能。
- JsStore:具有类似 SQL 语法的 IndexedDB 包装器。
- MiniMongo:一个客户端内存中的 mongodb,由 localstorage 支持,服务器通过 http 同步。MeteorJS 使用 MiniMongo。
- PouchDB:使用 IndexedDB 在浏览器中实现 CouchDB 的客户端
- idb:一个很小的(~1.15k)库,主要反映了 IndexedDB API,但有一些小的改进,对可用性有很大的影响。
- idb-keyval:使用 IndexedDB 实现的基于承诺的超简单小型(~600B)keyval 存储
- sifrr-storage:一个小的(~2kB)基于承诺的库,用于客户端键值存储。适用于 IndexedDB、localStorage、Web SQL(已弃用)、Cookie。可以根据优先级自动使用支持的可用存储。
- lovefield:Lovefield 是一个用于 Web 应用程序的关系数据库。用 JavaScript 编写,跨浏览器工作。提供快速、安全且易于使用的类似 SQL 的 API。
- $mol_db : 微型 (~1.3kB) TypeScript 外观,带有基于 Promise 的 API 和自动迁移。
- RxDB可以在 IndexedDB 之上使用的 NoSQL 客户端数据库。支持索引、压缩和复制。还为 IndexedDB 添加了交叉表功能和可观察性。