var db;
var version = 1;
var request = indexedDB.open("myDB", version);
request.onsuccess(function(e) {db = e.target.result;});
// db.close(); //??? happens async and has no callback
var request2 = indexedDB.open("myDB", ++version);
request.onsuccess = function() { console.log("success"); };
request.onerror = function() { console.log("error"); }; // called if db existed when page was loaded
request.onblocked = function(){console.log("blocked");}; // called on init creation
request.onupgradeneeded = function(){console.log("onupgradeneeded");};
我需要能够打开数据库,读取对象存储库,然后更改数据库。看起来每页加载只能改变一次db结构。
使用已弃用的setVersion方法时,这在Chrome中运行良好。
答案 0 :(得分:7)
IndexedDB API不易使用。一些事情:
1)在没有与db的其他打开连接之前,upgradeneeded不会触发。取消注释db.close()行。但是在请求收到成功事件之前,db不会是IDBDatabase对象,所以你必须等待它。
2)request2对象上没有事件处理程序。您可能打算在代码示例中的最后4行放置request2而不是request。
3)第一个request.onsuccess分配错误。
4)如果磁盘上的数据库的版本高于要传递的版本,则将调用错误处理程序。
试试这个:
indexedDB = indexedDB || mozIndexedDB;
var db;
var request = indexedDB.open("myDB");
request.onsuccess = function(e) {
db = e.target.result;
var version = db.version;
db.close();
var request2 = indexedDB.open("myDB", ++version);
request2.onsuccess = function() { console.log("success"); };
request2.onerror = function() { console.log("error"); };
request2.onblocked = function() { console.log("blocked"); };
request2.onupgradeneeded = function() { console.log("onupgradeneeded"); };
};
控制台将显示:
onupgradeneeded
success
如果不是: