我必须承认我对indexedDB还很陌生
我写了一个简单的代码indexedDB
,如下所示:
function go() {
var req = window.indexedDB.open("Uploader", 1),
db;
req.onerror = function (e) {
console.log("Error");
};
req.onsuccess = function (e) {
db = e.target.result;
};
req.onupgradeneeded = function (e) {
console.log(db);
db = e.target.result;
var os = db.createObjectStore("Files", { keyPath: "files" });
os.createIndex("text", "text_file", { unique: false });
var trans = db.transaction(["text"], "readwrite");
var objectstore = trans.objectStore("text");
var addreq = objectstore.add("Instructions.js");
addreq.onsuccess = function (e) {
console.log("Success!");
console.dir(e);
};
};
}
它给我的错误是Uncaught InvalidStateError: Failed to execute 'transaction' on 'IDBDatabase': A version change transaction is running.
这是说A version change Transaction is running
,但据我所知,版本更改事务是从IDBFactory.open
方法进行的,我没有使用,我已经指定此事务是readwrite
,此事务在onupgradeneeded
中,那么为什么会出现错误?
我必须承认我对indexedDB还很陌生
4条答案
按热度按时间0ve6wy6x1#
versionchange事务还允许您读写。您只需要访问onupgradeneded函数中为您创建的事务。
您遇到此错误的原因是,您试图在版本更改事务仍在运行时启动第二个事务。
bybem2ql2#
在尝试加载对象存储之前,需要检查版本更改事务是否完成:
xcitsw883#
在版本更改中,您不需要为事务指定作用域。这始终是所有预先设置的对象存储。
transaction.objectStore('text')
在这里,您正试图打开一个具有索引名称的对象存储,这是行不通的。如果要访问索引,您需要先转到对象存储。需要在对象存储上添加数据。
给予这个
ergxz8rk4#
总是使用官方的IndexedDB规范。MDN谎言,有很多不准确的地方,尤其是当涉及到类型的时候。