我有indexeddb的问题 - 我正在使用此方法打开并设置db
DBService.prototype.open = function (dbName, entity, cb) {
var self = this;
var req = indexedDB.open(dbName)
req.onsuccess = function(e) {
var v = 1;
DBService.storage.db = e.target.result;
var db = DBService.storage.db;
// We can only create Object stores in a setVersion transaction;
if (v != db.version) {
var setVrequest = db.setVersion(v);
setVrequest.onerror = function (err, stack) {
console.log(err, stack);
}
setVrequest.onsuccess = function(e) {
if(db.objectStoreNames.contains(entity)) {
db.deleteObjectStore(entity);
}
var store = db.createObjectStore(entity,
{keyPath: "timeStamp"});
e.target.transaction.oncomplete = function() {
console.log(db);
cb(db);
};
};
} else {
cb(db);
/*
req.transaction.oncomplete = function() {
cb(db);
*/
}
};
req.onerror = function (err, stack) {
console.log(err)
console.log(stack)
}
};
除了没有打开db的情况外,一切都很好用。我还在
InvalidStateError: DOM IDBDatabase Exception 11
(当我在console.log req.error时)
我知道这段代码现在非常脏,我正在尝试一切。我保证当它运作良好时,我会重构它!
谢谢!
答案 0 :(得分:3)
我假设您只在Chrome中使用此页面,因为其他浏览器不再支持setVersion。
你究竟是什么意思“除了没有打开数据库的情况外,一切都很好用。”?有时db.open调用失败并调用req.onerror?在任何情况下,您的错误事件处理程序应该只接受一个参数,只传递错误,而不是堆栈。
InvalidStateError的一个常见原因:您获得的DOM IDBDatabase异常11异常是在请求对象收到任何事件之前访问req.error。例如,此代码将抛出异常11:
var request = indexedDB.open("some db");
console.log(request.error);
,而
var request = indexedDB.open("some db");
request.onerror = request.onsuccess = function(e) { console.log(request.error); };
不会抛出异常。
您可能还想添加setVrequest.onblocked = function(e) { console.log("got blocked:" + e); };
,以便了解被阻止的事件是否会给您带来麻烦。
答案 1 :(得分:1)
“InvalidStateError:DOM IDBDatabase Exception 11”的另一个原因是当您尝试在Chrome中的setVersion操作中执行另一个事务时 - 通常在创建/升级数据库后立即填充数据。
如果你需要在setVersion完成后填充数据,那么你必须使用这个模式,否则你会得到这个例外 - 奇怪的是,对于Chrome 22我只看到一个扩展已经发布到chrome商店。
确保使用此模式:
https://groups.google.com/a/chromium.org/forum/#!msg/chromium-html5/VlWI87JFKMk/6GWbB_HvxtsJ
db.setVersion('3').onsuccess = function(event) {
var transaction = event.result;
transaction.oncomplete = function() {
db.transaction('mystore', 'readwrite').onsuccess = populateDataStore;
};
}