indexeddb 游标是遍历大量本地数据最高效、内存友好的方式,通过 opencursor 创建,支持范围查询、continue/advance 移动、delete/update 原地修改,需在 readwrite 事务中使用。

IndexedDB 的 cursor 游标是遍历大量本地数据最高效、内存友好的方式——它不一次性加载全部记录,而是按需逐条或分批读取,避免 OOM 和卡顿。
用 openCursor 启动游标遍历
游标必须通过 objectStore.openCursor() 或 index.openCursor() 创建,不能手动构造。调用后返回一个 IDBRequest,在 onsuccess 中获取 IDBCursor 实例:
- 游标默认从第一条记录开始,正向遍历(
"next");传入"prev"可倒序 - 可传入
IDBKeyRange限定范围,例如只查 2023 年之后的订单:store.openCursor(IDBKeyRange.lowerBound(20230101)) - 支持复合键范围,比如按 [status, createdAt] 查询已发货且本周创建的记录
在 cursor.onsuccess 中安全移动和读取
每次成功命中一条记录,都会触发 cursor.onsuccess,此时可通过 event.target.result 拿到当前游标对象:
-
cursor.key:当前记录主键(可能是 number、string 或 Date) -
cursor.value:完整数据对象 -
cursor.continue():移动到下一条(必须显式调用,否则停止) -
cursor.advance(n):跳过 n 条,适合分页跳转(如每页 50 条,第 3 页就advance(100))
注意:不要在循环中反复调用 openCursor(),应在单个游标链路中持续 continue(),否则会新建事务并中断上下文。
用 cursor.delete() 或 cursor.update() 原地修改
游标支持直接对当前记录执行写操作,无需先 get 再 put/delete,减少 I/O 和序列化开销:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
cursor.delete()删除当前项,游标自动前进到下一条(除非已是末尾) -
cursor.update(newValue)替换当前值,成功后游标保持位置不变(可再continue()) - 所有写操作必须在 readwrite 事务中进行,且游标需由该事务内的 objectStore 创建
例如清理过期缓存:遍历时检查 value.expiredAt ,满足即 <code>cursor.delete(),高效又省内存。
控制粒度:批量处理 + 事务分段防阻塞
遍历超万级数据时,连续 continue() 会阻塞主线程。推荐“小批量 + 事务重置”策略:
- 每处理 50 条,调用
setTimeout(() => { /* 下一批 */ }, 0)让出控制权 - 每个批次新建独立 readwrite 事务(避免长事务锁表),用
db.transaction(..., { durability: 'relaxed' })降低写入延迟 - 结合
cursor.skip(n)(非原生 API,需自行封装)实现断点续扫,适配后台同步场景
实际开发中,配合 Promise 包装游标逻辑,能更自然地组合 await/async 流程,比如 await eachCursor(store, { limit: 100 }) 封装一次批量迭代。
游标不是语法糖,它是 IndexedDB 应对海量本地数据的核心设计。用对范围、善用 continue/advance、配合事务节奏,就能稳稳撑起离线优先应用的数据层。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










