IndexedDB 是浏览器中用于离线海量结构化数据管理的异步事务型底层 API。其核心操作包括:1. 通过 open() 打开数据库并在 onupgradeneeded 中创建对象仓库与索引;2. 在 readwrite 事务中用 add()/put() 写入数据;3. 在 readonly 事务中用 get()/index.get()/openCursor() 等方式查询;4. 用 delete()/clear() 删除数据,推荐分批处理。

IndexedDB 是浏览器中用于存储大量结构化数据的底层 API,适合离线场景下的海量数据管理。它基于事务机制、支持索引查询、异步执行,不阻塞主线程。实现增删改查的关键在于正确打开数据库、创建对象仓库(Object Store)、使用事务和游标。
1. 打开数据库并创建/升级结构
首次打开或版本变更时触发 onupgradeneeded,必须在此阶段定义对象仓库和索引:
- 用
indexedDB.open("dbName", version)打开;version 是整数,升级时需增大 - 在
upgradeneeded中调用db.createObjectStore("storeName", { keyPath: "id", autoIncrement: true }) - 如需按非主键字段快速查询(如
name或createdAt),用store.createIndex("nameIndex", "name", { unique: false })
2. 添加与批量写入数据
所有写操作必须在事务中进行,推荐使用 readwrite 事务:
- 单条插入:
transaction.objectStore("users").add({ name: "张三", age: 28 }) - 批量插入(更高效):
store.put()或循环调用add(),但注意避免单次事务过大(建议每批 ≤ 1000 条) -
add()要求主键不重复,put()支持覆盖写入;失败时会触发事务的onerror
3. 查询:主键查、索引查、范围查、游标遍历
读操作可在 readonly 事务中完成,性能开销小:
批量分析录音转写,输出多维度拓客报告。触发词:录音分析、总结、音频总结、拜访记录总结。当用户提及「分析录音」「看看录音数据」「最近的录音」「通话记录」且意图为批量统计/分析时触发。仅出现「录音」或「拜访」时需结合上下文,若仅查看单条详情则不触发。
立即学习“Java免费学习笔记(深入)”;
- 主键精确查:
store.get(123)(返回 Promise 包裹的单个值) - 索引查:
store.index("nameIndex").get("李四") - 范围查(如时间区间):
store.index("timeIndex").openCursor(IDBKeyRange.bound(start, end)) - 全量遍历(适合分页或导出):
store.openCursor()+ 游标continue()循环,避免一次性加载全部数据
4. 删除与条件清理
删除也需事务,支持主键删、索引删、范围删:
- 按主键删:
store.delete(456) - 按索引条件删(需先查后删):先用
index.openCursor()找到匹配项,再对每个游标调用cursor.delete() - 清空整个仓库:
store.clear()(慎用,无确认机制) - 海量数据清理建议分批次执行,每次事务控制在 100–500 条,防止长时间阻塞或被浏览器中断
不复杂但容易忽略:始终监听事务的 oncomplete 和 onerror,错误时及时释放引用;大量数据操作建议封装为带进度回调的工具函数;IndexedDB 不支持 SQL,复杂查询需靠索引设计和前端逻辑配合。

















