IndexedDB API - 用于客户端存储大量结构化数据的低级 API
IndexedDB 是用于客户端存储大量结构化数据(包括文件 / blob)的低级 API。该 API 使用索引来实现这些数据的高性能搜索。虽然 Web Storage 对于存储少量数据很有用,但对于存储大量结构化数据则不太有用。IndexedDB 提供了一个解决方案。在这里我们提供了完整 API 参考和使用指南、浏览器支持详细信息以及关键概念的一些解释的链接。
注意:IndexedDB API 功能强大,但对于简单的情况可能看起来过于复杂。如果您更喜欢简单的 API,请尝试相关链接部分中的库,这些库使 IndexedDB 对程序员更友好。
关键概念和用法
IndexedDB 是一个事务数据库系统,就像一个基于 SQL 的 RDBMS。但是,与使用固定列表的基于 SQL 的 RDBMS 不同,IndexedDB 是基于 JavaScript 的面向对象的数据库。IndexedDB 允许您存储和检索使用 key 索引的对象;可以存储结构化克隆算法支持的任何对象。您需要指定数据库架构,打开与数据库的连接,然后在一系列事务中检索和更新数据。
- 阅读更多关于 IndexedDB 关键特征和基本术语。
- 通过我们的 使用 IndexedDB 指南,从第一原理学习异步使用 IndexedDB。
- 将用于离线存储数据的 IndexedDB 与用于离线存储资产的服务工作线程相结合,如使 PWA 与服务工作线程脱机工作 中所述。
注意:与大多数 Web 存储解决方案一样,IndexedDB 遵循 同源策略。因此,虽然您可以访问域内存储的数据,但您无法跨不同域访问数据。
同步和异步
使用 IndexedDB 执行的操作是异步完成的,以免阻塞应用程序。IndexedDB 最初包括同步和异步 API。同步 API 旨在仅用于 Web Workers,但已从规范中删除,因为不清楚是否需要它。但是,如果 Web 开发人员有足够的需求,可能会重新引入同步 API。
存储限制和驱逐标准
有许多网络技术可以在客户端(即在您的本地磁盘上)存储这样或那样的数据。IndexedDB 是最常被谈论的。浏览器计算分配给 Web 数据存储的空间以及达到该限制时要删除的内容的过程并不简单,并且因浏览器而异。浏览器存储限制和驱逐标准 试图解释这是如何工作的(至少在 Firefox 的情况下是这样)。
接口
要访问数据库,请在 window 对象的 indexedDB
属性上调用 open()
。此方法返回一个 IDBRequest
对象;异步操作通过 IDBRequest
对象触发事件传达给调用应用程序。
连接到数据库
IDBEnvironment
提供对 IndexedDB 功能的访问。它由 window
和 worker
对象实现。此接口不是 2.0 规范的一部分。
IDBFactory
提供对数据库的访问。它是由全局对象 indexedDB
实现的接口,因此是 API 的入口点。
IDBOpenDBRequest
表示打开数据库的请求。
IDBDatabase
表示与数据库的连接。这是在数据库上获取事务的唯一方法。
检索和修改数据
IDBTransaction
表示一个事务。您在数据库上创建一个事务,指定范围(例如您想要访问的对象存储),并确定您想要的访问类型(只读或读写)。
IDBRequest
处理数据库请求并提供对结果的访问的通用接口。
IDBObjectStore
表示一个对象存储,它允许访问 IndexedDB 数据库中的一组数据,通过主键查找。
IDBIndex
该接口也允许访问 IndexedDB 数据库中的数据子集,但使用索引来检索记录而不是主键。这有时比使用 IDBObjectStore
更快。
IDBCursor
用于迭代对象存储和索引。
IDBCursorWithValue
用于迭代对象存储和索引并返回游标的当前值。
IDBKeyRange
定义可用于从特定范围内的数据库检索数据的键范围。
IDBLocaleAwareKeyRange
定义了可以用于在一定范围内,以从数据库中检索数据的键范围,排序根据用于特定索引所指定的区域设置的规则(见的 createIndex()
的 optionalParameters
)。此接口不是 2.0 规范的一部分。
自定义事件接口
此规范使用以下自定义接口触发事件:
IDBVersionChangeEvent
IDBVersionChangeEvent
接口指示数据库的版本已更改,这是 IDBOpenDBRequest.onupgradeneeded
事件处理函数的结果。
过时的接口
该规范的早期版本还定义了以下现已删除的接口。如果您需要更新以前编写的代码,它们仍然被记录在案:
IDBDatabaseException
表示在执行数据库操作时可能遇到的异常情况。
IDBTransactionSync
IDBTransaction
的同步版本。
IDBObjectStoreSync
IDBObjectStore
的同步版本。
IDBIndexSync
IDBIndex
的同步版本。
IDBFactorySync
IDBFactory
的同步版本。
IDBEnvironmentSync
IDBEnvironment
的同步版本。
IDBDatabaseSync
IDBDatabase
的同步版本。
IDBCursorSync
IDBCursor
的同步版本。
实例
- eLibri:一个强大的图书馆和电子书阅读器应用程序,由 IndexedDB Mozilla DevDerby 的获胜者 Marco Castelluccio 编写。
- 待办事项通知 (查看在线实例):参考文档中的例子。
- 在 IndexedDB 中存储图像和文件
规范
规范 |
---|
Indexed Database API |
相关链接
- localForage:一个为客户端数据存储提供简单 “名称:值” 语法的 Polyfill,它在后台使用 IndexedDB,但在不支持 IndexedDB 的浏览器中回退到 WebSQL,然后使用 localStorage。
- Dexie.js:一个 IndexedDB 的封装,通过漂亮、简单的语法允许更快的代码开发。
- ZangoDB: 一个类似于 MongoDB 的 IndexedDB 接口,支持 MongoDB 的大多数熟悉的过滤、投影、排序、更新和聚合功能。
- JsStore: 一个带有类似 SQL 语法的 IndexedDB 封装。
- MiniMongo:由本地存储支持的客户端内存 mongodb,通过 http 进行服务器同步。MiniMongo 由 MeteorJS 使用。
- PouchDB:一个在浏览器中使用 IndexedDB 实现的 CouchDB 客户端
- idb:一个很小的(~1.15k)库,大部分反映了 IndexedDB 的 API,但有一些小的改进,对可用性产生了很大的影响。
- idb-keyval:一个使用 IndexedDB 实现的超简单小(~600B)基于承诺的 keyval 存储。
- sifrr-storage:用于客户端键值存储的小型(~2kB)基于承诺的库。适用于 IndexedDB、localStorage、WebSQL、Cookies。可以根据优先级自动使用受支持的可用存储。
- lovefield: Lovefield 是一个用于 Web 应用程序的关系数据库。用 JavaScript 编写,跨浏览器工作。提供快速、安全且易于使用的类似 SQL 的 API。
- $mol_db:小巧(约1.3kB)的 TypeScript facade,具有基于承诺的接口和自动迁移功能。