IndexedDB 是浏览器内置支持事务的 NoSQL 数据库,基于对象仓库、索引和游标实现 CRUD 操作,天然适配离线场景;所有结构定义必须在 onupgradeneeded 中完成,通过版本号触发升级;增删改查均依赖主键或索引,put() 统一处理插入与更新,get()/getAll()/index+cursor 支持多种查询模式,delete()/clear() 实现精准或批量删除。

IndexedDB 是浏览器内置的、支持事务的 NoSQL 数据库,专为在客户端存储大量结构化数据而设计,天然适合离线场景。它不是简单的 key-value 存储,而是基于对象仓库(object store)、索引(index)和游标(cursor)的完整数据库模型,能可靠支撑增删改查(CRUD)操作,即使网络断开也能正常工作。
打开数据库并创建/升级对象仓库
IndexedDB 的所有操作都必须在数据库版本升级时定义结构。首次打开或版本变更时,通过 onupgradeneeded 创建或修改 object store(类似表),并可同时建立索引提升查询效率。
- 用
window.indexedDB.open("myDB", 2)打开数据库,第二个参数是版本号;版本号增大才会触发升级 - 在
onupgradeneeded中检查是否存在 object store,不存在则用db.createObjectStore("users", { keyPath: "id" })创建,keyPath指定主键字段 - 如需按其他字段快速查询(比如 email),调用
store.createIndex("emailIndex", "email", { unique: true })
添加与修改数据:统一用 put() 方法
IndexedDB 中插入新记录和更新已有记录都用 put() —— 它会根据主键自动判断是新增还是覆盖。只要对象包含主键(如 id),就能安全完成“上写”操作。
- 获取事务和 object store:
const tx = db.transaction("users", "readwrite"); const store = tx.objectStore("users"); - 写入单条:
store.put({ id: 1, name: "张三", email: "zhang@example.com" }); - 批量写入可用
add()(仅插入,重复主键报错)或循环调用put();注意put()不会拒绝已存在主键的数据,而是直接更新
查询数据:get()、getAll() 和 index + openCursor()
根据使用场景选择合适方式:精确主键查用 get(),全量查用 getAll(),范围查或条件查依赖索引 + 游标。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
-
store.get(1):按主键快速取单条,返回 Promise 或通过onsuccess获取结果 -
store.getAll():获取全部记录(慎用于大数据量);加参数如store.getAll(IDBKeyRange.bound(1, 10))可限制主键范围 - 按索引查:如查 email 为 "zhang@example.com" 的用户,先获取索引
const index = store.index("emailIndex");,再用index.get("zhang@example.com") - 遍历筛选:用
store.openCursor(IDBKeyRange.only("张三"))或结合索引游标实现复杂条件过滤
删除数据:delete() 和 clear()
删除操作同样基于主键或范围,不支持 SQL 式 WHERE 条件,但可通过索引+游标组合实现逻辑删除效果。
-
store.delete(1):按主键删一条 -
store.delete(IDBKeyRange.lowerBound(5)):删主键 ≥5 的所有记录 -
store.clear():清空整个 object store(谨慎使用) - 若需按非主键字段删除(如删所有 status 为 "draft" 的记录),先用对应索引定位,再用游标逐条调用
cursor.delete()
IndexedDB 的离线能力来自其完全运行在本地,所有操作不依赖网络。只要页面加载过脚本,后续增删改查均可立即执行。关键是要正确处理事务生命周期、错误回调(如 QuotaExceededError、AbortError)以及版本升级逻辑。把数据操作封装成 Promise 工具函数后,使用体验接近现代 ORM,离线体验自然可靠。

















