在firefox中打开indexedDB数据库之后,你能改变它的结构吗?

时间:2012-05-04 18:20:59

标签: indexeddb

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中运行良好。

1 个答案:

答案 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

如果不是:

  1. 检查没有其他选项卡与此数据库建立连接。
  2. 为要请求的其他三个事件添加处理程序,查看哪个事件触发。