我想创建多个数据存储区,所以我找到了解决方案,我可以在版本更改时执行此操作。
所以我写了以下
var request = indexedDB.open(dbName);
request.onsuccess = function (e){
var db = e.target.result;
var version = db.version;
db.close();
var request2 = indexedDB.open(dbName , ++version);
console.log(request2); //Error on this line
request2.onsuccess = function() { console.log("success .. "); };
request2.onerror = function() { console.log("error..."); };
request2.onblocked = function() { console.log("blocked..."); };
request2.onupgradeneeded = function(e2) {
//Will creaate new datastore here
};
}
当我使用更高版本打开数据库时,它会发出以下错误" 错误:[例外:DOMException] "
DBOpenDBRequest {onupgradeneeded: null, onblocked: null, onerror: null, onsuccess: null, readyState: "pending"…}
error: [Exception: DOMException]
onblocked: function () { console.log("blocked..."); }
onerror: function () { console.log("error..."); }
onsuccess: function () { console.log("success .. "); }
onupgradeneeded: function (e2) {
readyState: "pending"
result: [Exception: DOMException]
source: null
transaction: null
__proto__: IDBOpenDBRequest
提前致谢。
答案 0 :(得分:2)
我认为版本属性可能是个问题。你确定它有价值吗?当版本的值为0或负数时打开数据库时会发生DOM异常。有关详细信息,请参阅the specs
当您尝试使用更高版本再次打开数据库时,会出现阻止事件。
尝试将以下内容添加到db对象中。
db.onversionchange = function (event) { event.target.close(); }
这将关闭当前连接。因此db的升级可以继续。升级数据库时,您无法建立任何打开的连接。
答案 1 :(得分:2)
你的IDB没事。看起来您的第二个success
回调中存在范围问题。我发现request2
对象未定义但请求本身没问题。
Here's a working fiddle剥离了核心问题(第二个IDBOpenRequest
) - 执行此操作时,您会看到每次运行时的版本增量。
var dbName = 'User780611',
request = indexedDB.open(dbName);
request.onsuccess = function (e) {
var db = e.target.result;
var version = db.version;
db.close();
var request2 = indexedDB.open(dbName, ++
version);
request2.onsuccess = function () {
window.document.getElementById('User780611').innerHTML = this.result.version;
};
}
答案 2 :(得分:0)
我的猜测是请求2的打印输出错误,因为它仍然忙于打开数据库或调用upgradeneeded。我认为 - 如果删除console.log(request2); - 尝试捕捉代码 - 将console.log放入所有回调中,您将看到正在发生的事情。
var request = indexedDB.open(dbName);
request.onsuccess = function (e){
var db = e.target.result;
var version = db.version;
db.onversionchange = function () { console.log("version change ...."); };
db.close();
try
{
var request2 = indexedDB.open(dbName , ++version);
//console.log(request2); //Error on this line
request2.onsuccess = function() { console.log("success .. "); };
request2.onerror = function() { console.log("error..."); };
request2.onblocked = function() { console.log("blocked..."); };
request2.onupgradeneeded = function(e2) {
//Will creaate new datastore here
console.log("upgradeneeded...");
};
}
catch(ex)
{
console.log(ex);
}
}
答案 3 :(得分:0)
我刚遇到同样的问题。正如克里斯托夫所说,“封锁”信息意味着存在开放的联系。因此,尽管第一个request.onsuccess回调中的db.close()
仍然出现它仍然出现的原因意味着还有另一个数据库仍然打开。因此,您需要在执行第二个请求之前关闭它。
以下是我为了添加对象存储而解决的问题:
var idb = (function(){
var idbObj = {};
var db = null; //gonna need to close this db later when adding new object store
const dbName = "collectionDB3";
var version = 1;
idbObj.open = function(){
var objectStore;
var dbRequest = window.indexedDB.open(dbName);
dbRequest.onupgradeneeded = function(event){
var thisDB = event.target.result;
if(!thisDB.objectStoreNames.contains("collection")) {
objectStore = thisDB.createObjectStore("collection", { keyPath: 'id', autoIncrement: true });
}
console.log("upgrading", thisDB);
};
dbRequest.onsuccess = function(event){
db = event.target.result;
version = db.version;
console.log("opened database", version);
};
dbRequest.onerror = function(event){
console.log("database error ", event.target.errorCode);
};
};
idbObj.addObjectStore = function(storeName){
db.close(); //this is where the only opened db connection is closed
var request = indexedDB.open(dbName, version+1); //increment version to create object store in onupgradeneeded
request.onupgradeneeded = function (event) {
var thisDB = event.target.result;
if(!thisDB.objectStoreNames.contains(storeName)) {
var objectStore = thisDB.createObjectStore(storeName, { keyPath: 'id', autoIncrement: true });
}
};
request.onsuccess = function (event) {
db = event.target.result; //update db
version = db.version; //update db's version
console.log("added objectstore", db);
};
request.onerror = function(event){
console.log("database error ", request.error);
};
};
return idbObj;
}());
idb.open();
createObjectStore(); //test the addObjectStore method see if new object store is created
function createObjectStore(){
setTimeout(function(){idb.addObjectStore("newStoreName")}, 3000);
}
希望这有助于=)