IndexedDB 通过 indexedDB.open() 异步创建或打开数据库,需处理 success、error、onblocked 及 onupgradeneeded 事件;升级时在 onupgradeneeded 中建对象仓库,不可在 onsuccess 中操作。

在 JavaScript 中使用 IndexedDB 创建和打开本地数据库,本质是通过 indexedDB.open() 发起一个异步请求,它会自动创建(如果不存在)或打开(如果已存在)指定名称的数据库。关键不在于“手动创建”,而在于正确处理打开流程、版本升级和对象仓库初始化。
调用 indexedDB.open() 启动连接
这是唯一入口方法,传入数据库名和可选版本号:
- 不传版本号时,默认使用当前已存在的版本;若数据库不存在,则使用默认版本 1
- 传入比当前更高的版本号(如从 1 升到 2),会触发
onupgradeneeded事件,必须在此完成结构变更 - 示例:
const request = indexedDB.open("myAppDB", 1);
监听 success 和 error 事件获取连接结果
打开操作是异步的,需通过事件处理成功或失败:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
-
request.onsuccess:触发时表示数据库已就绪,可通过request.result获取IDBDatabase实例 -
request.onerror:发生权限拒绝、磁盘满、非法数据库名等错误时触发 -
request.onblocked:当旧版本数据库仍被其他页面打开,新版本无法升级时触发(提示用户刷新)
在 onupgradeneeded 中定义对象仓库(首次或升级时)
只有在这个事件中才能新建/修改对象仓库(object store)和索引。注意:
立即学习“Java免费学习笔记(深入)”;
-
event.target.result是即将创建/升级的数据库实例(不是当前打开的旧库) - 不能在
onsuccess里调用createObjectStore(),否则报错 “InvalidStateError” - 示例(创建名为 "users" 的仓库,以 "id" 为键路径):
const db = event.target.result;
if (!db.objectStoreNames.contains("users")) {
db.createObjectStore("users", { keyPath: "id" });
}
关闭与复用数据库连接
IndexedDB 连接不是长期持有资源,但需注意:
- 每次
indexedDB.open()都返回新连接,建议缓存request.result得到的IDBDatabase实例供后续事务使用 - 数据库连接会在页面卸载或长时间空闲后自动关闭,通常无需主动调用
db.close() - 若需确保写入完成,可在事务的
oncomplete中安全关闭(较少见)

















