indexeddb创建与升级数据库的核心是open()方法触发onupgradeneeded事件,仅在此事件中可创建或修改对象仓库;首次打开时自动创建并触发该事件,升级需提高version参数并再次调用open(),旧store默认保留,修改keypath需先删除再重建。

IndexedDB 创建数据库和升级版本的核心在于 open() 方法的调用时机与回调处理,关键不是“新建”,而是“打开时触发创建或升级逻辑”。
打开并创建数据库(首次)
调用 indexedDB.open(name, version) 时,如果数据库不存在,会触发 onupgradeneeded 事件 —— 这是唯一能创建对象仓库(object store)的地方。
- version 是正整数(如 1),不能为 0 或小数
- 第一次打开时,浏览器自动创建数据库,并立即触发
onupgradeneeded - 在该事件中用
event.target.result获取数据库实例,再调用createObjectStore()
示例:
const request = indexedDB.open('myApp', 1);
request.onupgradeneeded = (event) => {
const db = event.target.result;
// 创建名为 'users' 的对象仓库,主键为 id
if (!db.objectStoreNames.contains('users')) {
db.createObjectStore('users', { keyPath: 'id' });
}
};
request.onsuccess = () => {
console.log('数据库已就绪');
};
升级数据库版本并新增/修改对象仓库
后续想加新表(对象仓库)或改结构,必须显式调高 version 参数,再次调用 open() —— 此时会再次进入 onupgradeneeded,旧版本仓库仍存在,可安全增删改。
- 只在
onupgradeneeded中操作 schema(建/删 store、加索引),其他地方不允许 - 升级时,旧 store 默认保留;如需删除,用
deleteObjectStore() - 若要修改主键或 keyPath,必须删掉旧 store 再重建(无法原地修改)
例如从 v1 升级到 v2,新增订单表:
const request = indexedDB.open('myApp', 2); // 版本号+1
request.onupgradeneeded = (event) => {
const db = event.target.result;
// v1 已有 'users',v2 新增 'orders'
if (!db.objectStoreNames.contains('orders')) {
db.createObjectStore('orders', { keyPath: 'orderId', autoIncrement: true });
}
// 如需迁移数据,可在此读取旧 store 并写入新 store
};
避免常见陷阱
版本升级失败往往源于逻辑误判或异步时序问题:
- 不要在
onsuccess里调createObjectStore()—— 会报错 “InvalidStateError” - 多个 tab 同时打开同一数据库?
onupgradeneeded可能被多次触发,但只有一个 tab 能成功升级,其余会等待或失败,建议做好错误兜底 - 用户手动删了数据库?下次打开仍走
onupgradeneeded,就像首次一样,无需特殊处理 - 升级过程中抛异常?事务自动中止,数据库回退到旧版本,不会损坏数据
封装建议:用 Promise 管理打开流程
原始 API 基于事件,容易嵌套。推荐封装成 Promise,让版本控制更清晰:
function openDB(name, version, upgradeCb) {
return new Promise((resolve, reject) => {
const req = indexedDB.open(name, version);
req.onupgradeneeded = (e) => upgradeCb?.(e.target.result, e.oldVersion, e.newVersion);
req.onsuccess = () => resolve(req.result);
req.onerror = () => reject(req.error);
});
}
// 使用
openDB('myApp', 3, (db, old, newV) => {
if (old
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











