更新 我发现问题是它被阻止了。尽管数据库总是由同一个扩展创建和升级,但它并没有关闭。所以现在我正在调用“onblocked”函数。
如何“解锁”当前被阻止的数据库?将来如何防止这种情况发生?这是一个应用程序,所以没有标签正在使用它。而且由于我无法打开这些数据库甚至删除它们(这也会被阻止),我该如何关闭它们?
(对于任何想知道的人,为了从一开始就避免这个问题,您必须执行以下操作:)
mydb.onversionchange = function(event) {
mydb.close();
};
原帖
如果我(不小心)尝试使用错误的版本打开和升级,IndexedDB 就会死掉并且无法打开。据我所知,没有办法向 indexedDB 询问最新版本的数据库。因此,如果我尝试运行以下代码两次,它会破坏数据库并且变得无法打开:
它从不抛出错误或调用 onerror。它只是静静地坐着
var db = null;
//Note, no version passed in, so the second time I do this, it seems to cause an error
var req = indexedDB.open( "test" );
req.onsuccess = function(event) { console.log( "suc: " + event.target.result.version ); db = event.target.result; };
req.onerror = function(event) { console.log( "err: " + event ); };
req.onupgradeneeded = function(event) { console.log( "upg: " + event.target.result.version ); };
//We're doing in interval since waiting for callback
var intv = setInterval(
function()
{
if ( db === null ) return;
clearInterval( intv );
var req2 = indexedDB.open( "test", db.version + 1 );
req2.onsuccess = function(event) { console.log( "suc: " + event.target.result.version ); };
req2.onerror = function(event) { console.log( "err: " + event ); };
req2.onupgradeneeded = function(event) { console.log( "upg: " + event.target.result.version ); };
},
50
);
所有这些代码都在我的chrome.runtime.onInstalled.addListener
. 所以当我更新我的应用程序时,它会再次调用它。如果我indexedDB.open( "test" )
在没有传入新版本的情况下调用,然后再次运行 setInterval 函数,它会导致一切变得不可用,并且我永远无法再次打开“测试”。如果我可以在尝试打开数据库之前查询 indexedDB 的数据库版本,这将得到解决。那存在吗?