createobjectstore必须在onupgradeneeded中调用,因仅该事件触发的versionchange事务允许修改数据库结构;在success等其他回调中调用会抛invalidstateerror。

createObjectStore 必须在 onupgradeneeded 里调用
直接在 open 后的 success 回调里调用 createObjectStore 会报错:InvalidStateError: Failed to execute 'createObjectStore' on 'IDBDatabase': The database is not running in version change transaction. —— 因为只有在数据库结构升级事务中(即 onupgradeneeded)才允许修改 schema。
实操建议:
- 把
createObjectStore放进onupgradeneeded事件处理函数里,哪怕只是首次打开数据库也要触发它(此时 oldVersion 是 0) - 不要在
onsuccess或onerror中尝试建 store - 如果后续要新增 store,必须显式调用
open(dbName, newVersion)升级版本号,否则onupgradeneeded不会触发
createObjectStore 的 keyPath 和 autoIncrement 参数怎么选
keyPath 指定对象中哪个字段作为主键;autoIncrement 为 true 时,系统自动生成递增数字键(忽略对象里的 key 字段)。二者互斥:设了 keyPath 就不能开 autoIncrement,反之亦然。
常见场景与建议:
- 用业务 ID(如
"id"或"uuid")作主键 → 传{ keyPath: "id" } - 纯本地缓存、无自然键 → 用
{ autoIncrement: true },插入时不用提供 key - 想用复合键?不行。
createObjectStore不支持多字段 keyPath;得用index配合keyPath: ["a", "b"](仅部分浏览器支持,且需谨慎)
重复调用 createObjectStore 会报错
如果数据库已存在该 store,再次在 onupgradeneeded 中调用 createObjectStore("logs") 会抛出 ConstraintError: Failed to execute 'createObjectStore' on 'IDBDatabase': An object store with the specified name already exists.
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
安全做法:
- 先检查
event.target.result.objectStoreNames.contains("logs"),再决定是否创建 - 或者统一用「先删后建」逻辑(仅开发期调试用,线上慎用):
db.deleteObjectStore("logs"); db.createObjectStore("logs", ...) - 版本升级时,新增 store 可以直接建;但修改已有 store 的 keyPath 或其他选项,必须删掉重建(IndexedDB 不支持 alter)
store 创建后立即使用要注意事务生命周期
在 onupgradeneeded 里创建的 store,只能在当前 upgrade transaction 中使用。如果试图在事务外立刻 transaction("logs").objectStore("logs").add(...),会得到 TransactionInactiveError。
正确流程:
- 在
onupgradeneeded中只负责定义结构(建 store、建 index) - 数据写入放在
onsuccess或单独新开一个 readwrite 事务里 - 注意:事务对象(
IDBTransaction)是短命的,一旦事件循环结束就自动 commit 或 abort,别缓存它复用
最易被忽略的一点:IndexedDB 的版本号是整数,且必须严格递增;跳过中间版本(比如从 1 直接升到 3)会导致 onupgradeneeded 的 oldVersion 是 1 而不是 2,你的迁移逻辑可能漏掉 v2→v3 的步骤。升级务必线性、可回溯。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










