在Firefox 17.0.1中,当我尝试打开IndexedDB数据库时,Firebug控制台向我显示 InvalidStateError 异常。此外,还会引发request.onerror
个事件,但event.target.errorCode
未定义。
if (window.indexedDB) {
var request = window.indexedDB.open('demo', 1);
request.onsuccess = function(event) {
// not raised
};
request.onupgradeneeded = function(event) {
// not raised
};
request.onerror = function(event) {
// raised with InvalidStateError
};
}
有没有人在Firefox中使用过IndexedDB?
更新
Firefox 18.0.1具有相同的行为。 Comlete source
答案 0 :(得分:3)
我回答是因为问题仍然存在(在Firefox 54中)。如果您:
,就会发生这种情况要防止 InvalidStateError ,尝试捕获不起作用(但对其他错误有用,例如禁用的Cookie),而是需要事件。 preventDefault()方法。是的,我知道,太容易成为现实。 :)
if (window.indexedDB) {
var request = window.indexedDB.open('demo', 1);
request.onsuccess = function(event) {
// not raised
};
request.onupgradeneeded = function(event) {
// not raised
};
request.onerror = function(event) {
// raised with no InvalidStateError
if (request.error && request.error.name === 'InvalidStateError') {
event.preventDefault();
}
};
}
Kudos转到https://bugzilla.mozilla.org/show_bug.cgi?id=1331103#c3。
答案 1 :(得分:1)
我很确定您收到的错误是版本错误,这意味着当前版本的数据库高于您打开数据库的版本。如果你查看event.target.error,你会发现该名称将包含“VersionError”。
另一种可能性是您将看到“AbortError”,这意味着VERSION_CHANGE事务已中止。意味着导致中止的onupgradeneeded事件中存在错误。如果要创建已存在的对象库,则可以获得此结果。
我认为没有其他可能性,如果没有提供更多关于你得到的错误的信息。
答案 2 :(得分:0)
您需要在单独的事务中创建对象存储,您将开放数据库和创建对象存储事务都集中到同一事件中。
此外,您不能同时拥有autoincrement
和path
作为对象商店的选项。你必须选择其中一个。
以下是将您的示例发布的代码:
function initDB() {
if (window.indexedDB) {
var request = window.indexedDB.open('demo', 1);
request.onsuccess = function(event) {
db = event.target.result;
createObjectStore();
};
request.onupgradeneeded = function(event) {
db = event.target.result;
$('#messages').prepend('blah blah<br/>');
};
request.onerror = function(event) {
$('#messages').prepend('Chyba databáze #' + event.target.errorCode + '<br/>');
};
}
}
function createObjectStore() {
db.close();
var request = window.indexedDB.open('demo', 2);
request.onsuccess = function(event) {
db = event.target.result;
showDB();
};
request.onupgradeneeded = function(event) {
db = event.target.result;
$('#messages').prepend('yeah yeah yeah<br/>');
var store = db.createObjectStore('StoreName', { keyPath: 'id' });
store.createIndex('IndexName', 'id', { unique: true });
};
request.onerror = function(event) {
$('#messages').prepend('Chyba databáze #' + event.target.errorCode + '<br/>');
};
}
如果你开始陷入困境,你可以看看我为Firefox addon-sdk编写的一些indexeddb代码。代码比您需要的更复杂,但您将能够看到所有需要发生的事件,错误和事务的顺序。 https://github.com/clarkbw/indexed-db-storage
祝你好运!答案 3 :(得分:0)
如果在FireFox设置的“隐私”标签中将浏览器设置为“不存储历史记录”,则在使用IndexedDB时,FireFox也会抛出“ InvalidStateError”。
我相信设置该设置后,FireFox基本上会以隐身模式运行。 在私有模式下运行FireFox时,IndexedDB不可用。