【发布时间】:2013-06-11 01:50:23
【问题描述】:
更新 我发现问题是它被阻止了。尽管数据库总是由同一个扩展创建和升级,但它并没有关闭。所以现在我正在调用“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 的数据库版本,这将得到解决。存在吗?
【问题讨论】:
标签: google-chrome google-chrome-extension local-storage indexeddb google-chrome-app