IndexedDB 是浏览器内置的异步事务型键值对数据库,需按打开数据库、创建对象仓库与索引、事务中增删改查、处理异步错误四步操作,全程异步且依赖事务机制。

IndexedDB 是浏览器内置的异步、事务型、键值对存储数据库,适合在前端持久化大量结构化数据。它不基于 SQL,但支持索引、游标和事务机制,操作全程异步(基于 Promise 或事件回调),需按固定流程打开、建表、增删改查。
1. 打开数据库并处理版本升级
使用 window.indexedDB.open() 打开数据库,传入数据库名和可选版本号。首次打开或版本号升高时会触发 onupgradeneeded 事件,在其中创建/修改对象仓库(Object Store)和索引。
- 版本号必须是整数,不能为字符串或小数;未指定时默认为 1
- onupgradeneeded 是唯一能新建/删除对象仓库、添加索引的地方
- 即使只读操作,也必须先成功打开数据库(即进入 onsuccess)才能进行后续操作
2. 创建对象仓库与索引
在 onupgradeneeded 回调中,通过 event.target.result 获取数据库实例,调用 createObjectStore() 建立对象仓库。可指定主键路径(keyPath)或启用自增(autoIncrement)。
- 主键路径如
"id"表示数据对象中 id 字段作为主键;若设为null且不启用 autoIncrement,则每次添加需显式传入 key - 用 objectStore.createIndex() 添加辅助索引,支持按非主键字段快速查询(如
name、createdAt) - 索引可设
{ unique: true, multiEntry: false }控制唯一性和数组展开行为
3. 在事务中执行增删改查
所有读写操作都必须在事务(IDBTransaction)中进行。通过 db.transaction(storeName, mode) 获取事务,再用 transaction.objectStore(storeName) 获取对象仓库实例。
立即学习“Java免费学习笔记(深入)”;
- 事务模式:"readonly"(默认)、"readwrite"、"versionchange"(仅升级时自动使用)
- 添加数据用 add()(主键冲突报错)或 put()(覆盖同主键);删除用 delete();查询用 get()(单条)、getAll()(全部)或 openCursor()(遍历)
- 支持使用索引查询:如
store.index('name').get('Alice')
4. 正确处理异步结果与错误
IndexedDB 原生基于事件,推荐封装为 Promise 以简化逻辑。每个操作(open、add、get 等)返回 IDBRequest 对象,监听其 onsuccess 和 onerror。
- 成功时,结果在 event.target.result 中(如 open 成功返回 IDBDatabase,get 成功返回数据对象)
- 错误时,可通过 event.target.error.name 判断类型(如 "AbortError"、"ConstraintError"、"NotFoundError")
- 事务失败会自动回滚,无需手动处理;但应监听 transaction.onabort 或 transaction.onerror 进行日志或提示
不复杂但容易忽略:事务生命周期短,所有操作必须在事务完成前发起;游标遍历时注意避免无限循环;大量数据建议分批写入并控制事务大小,防止阻塞 UI。










