var database = window.indexedDB.open("myTestDatabase", 3);
database.onerror = function(event) {
alert('Error creating database');
}
database.onupgradeneeded = function(event) {
var db = event.target.result;
console.log(1);
//
if (!db.objectStoreNames.contains("data")) {
//Add to indexDB
db.createObjectStore("data", {
keypath: "data"
});
}
}
//If the database is creaed run.
database.onsuccess = function(event) {
var db = event.target.result;
var transaction = db.transaction(["data"], 'readwrite');
//More code here to store data into indexeddb
}
运行代码时,遇到以下错误:Uncaught NotFoundError: 无法在“IDBDatabase”上执行“transaction”:未找到指定的对象存储之一。
查看indexeddb时,会创建“myTestDatabase”,但不会创建“data”对象存储。这可能有什么问题?有时它会起作用,但有时会失败。
将版本从 1 增加到 2,对我有用 const openRequest = window.indexedDB.open('purple_score', 2);
您只能在数据库升级期间向 Indexeddb 数据库添加新的对象存储:即。
onupgradeneeded
。
看修改如下;
const createObjectStore = (
database,
objectStore,
key,
indexIsUnique = true
) => {
const DB = indexedDB
let request = DB.open(database)
request.onsuccess = () => {
let db = request.result
if(!db.objectStoreNames?.contains(objectStore))
{
let newDBVersion = db.version + 1
db.close()
let newRequest = DB.open(database, newDBVersion)
newRequest.onupgradeneeded = () => {
let upgradedDB = newRequest.result
try
{
const collection = upgradedDB.createObjectStore(objectStore, { keyPath: key })
collection.createIndex(key, key, { unique: indexIsUnique })
} catch (error)
{ throw new Error(error) }
}
newRequest.onerror = (error) => {
throw new Error(error)
}
}
}
request.onerror = (e) => {
alert(e)
console.log(e);
}
}
我还建议您将此函数重写为
async
函数或 Promise
但这完全取决于您。