ОБНОВЛЕНИЕ Я обнаружил, что проблема в том, что он заблокирован. Несмотря на то, что база данных всегда создается и обновляется одним и тем же расширением, она не закрывается. Итак, теперь я вызываю функцию «заблокировано».
Как «разблокировать» заблокированные в настоящее время базы данных? И как предотвратить это в будущем? Это приложение, поэтому никакие вкладки его не используют. И поскольку я не могу открыть эти базы данных, чтобы даже удалить их (это также блокируется), как мне их закрыть?
(Для тех, кто интересуется, чтобы избежать этой проблемы с самого начала, вы ДОЛЖНЫ сделать следующее:)
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 версию базы данных, прежде чем пытаться ее открыть. Это существует?