IndexedDB数据库已创建但对象存储空间未生成问题求助
解决IndexedDB对象存储空间未创建的问题
问题分析
你的代码存在两个核心问题导致对象存储空间不显示:
- 名称不匹配:代码中创建的对象存储空间是
"nombres",但你在控制台查找的是"names",两者名称不一致,自然找不到目标存储空间。 - 版本号未触发升级逻辑:
upgradeneeded事件仅在数据库版本号高于本地已存在的版本时才会执行。如果之前已经打开过版本1的MyDatabase,即使之前没创建对象存储空间,现有版本号不变的话,升级逻辑不会重新执行。
解决步骤
1. 统一对象存储空间名称
根据需求修改代码中的名称,确保和你要查找的一致:
- 如果需要
names,将db.createObjectStore("nombres", ...)改为db.createObjectStore("names", ...) - 如果确认要
nombres,则在浏览器控制台中查找这个名称的存储空间。
2. 触发升级逻辑(二选一)
方法一:删除现有数据库
打开浏览器开发者工具的「Application」面板,找到IndexedDB下的MyDatabase,右键删除后重新运行代码。
方法二:升级数据库版本号
将indexedDB.open("MyDatabase", 1)中的版本号改为更高的数字(比如2),强制触发upgradeneeded事件:
const IDBRequest = indexedDB.open("MyDatabase", 2); IDBRequest.addEventListener("upgradeneeded", (event) => { const db = event.target.result; // 先检查存储空间是否已存在,避免重复创建报错 if (!db.objectStoreNames.contains("names")) { db.createObjectStore("names", { autoIncrement: true }); } }); IDBRequest.addEventListener("success", () => { console.log("数据库打开成功"); }); IDBRequest.addEventListener("error", (event) => { console.log("打开数据库出错:", event.target.error); });
额外优化点
- 使用
event.target.result获取数据库实例,比直接访问IDBRequest.result更可靠,符合IndexedDB事件回调的标准用法。 - 添加
db.objectStoreNames.contains检查,避免重复创建对象存储空间导致的错误。
内容的提问来源于stack exchange,提问作者Jhoni bravo
相关产品推荐
相关产品推荐

