必须在onupgradeneeded事件中创建objectstore,因仅此时允许修改数据库结构;open成功后不可操作,否则报invalidstateerror;版本升级需递增版本号并在对应upgradeneeded中安全新增或索引。

在 JavaScript 中使用 IndexedDB 的 open 方法打开数据库并创建 objectStore,关键在于正确处理数据库的打开流程、版本升级逻辑和对象存储空间的创建时机。直接在 open 成功回调里创建 objectStore 是无效的——必须在 onupgradeneeded 事件中操作,因为只有该事件中数据库结构才允许被修改。
1. 调用 open 并监听 onupgradeneeded
indexedDB.open 返回一个 IDBOpenDBRequest 对象,它会触发三个核心事件:
- success:数据库已存在且版本匹配,打开成功;
- error:打开失败(如权限问题、路径异常);
- upgradeneeded:数据库不存在,或传入的版本号高于当前版本 —— 这是唯一能创建/修改 objectStore 的时机。
注意:即使只是首次打开数据库,也一定会触发 upgradeneeded,因为此时数据库还不存在。
2. 在 upgradeneeded 中创建 objectStore
在 event.target.result(即 db 实例)上不能直接调用 createObjectStore,而要通过 event.target.transaction 获取升级事务,并在其上创建:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
示例代码:
const request = indexedDB.open('myDB', 1);
request.onupgradeneeded = function(event) {
const db = event.target.result;
// ✅ 正确:通过 upgrade transaction 创建
const store = db.createObjectStore('users', { keyPath: 'id' });
// 可选:添加索引
store.createIndex('by_name', 'name', { unique: false });
};
request.onsuccess = function(event) {
const db = event.target.result;
console.log('数据库打开成功');
};
⚠️ 错误写法:db.createObjectStore(...) 放在 onsuccess 里会报错:“InvalidStateError: Failed to execute 'createObjectStore' on 'IDBDatabase': The database is not running a versionchange transaction.”
3. 处理版本升级(后续迭代)
当需要新增 objectStore 或修改结构时,需提升版本号(如从 1 → 2),并在新的 upgradeneeded 中安全操作:
- 旧 objectStore 会自动保留,无需重新创建;
- 只对新增或变更的部分做操作(例如加新 store、加新索引);
- 不要重复调用
createObjectStore同名 store,否则报错“ConstraintError”。可先检查db.objectStoreNames.contains('xxx')再创建。
4. 常见注意事项
-
keyPath 必须与数据结构一致:比如设为
'id',则每条记录必须有id字段且不可为undefined; -
autoIncrement:若不指定 keyPath,可设
{ autoIncrement: true }让 IDB 自动分配数字键; -
事务生命周期:upgrade transaction 在
upgradeneeded处理完后自动提交,不能手动 commit; - 异步无阻塞:所有操作都是异步的,不能同步获取结果,需链式监听 success/error。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










