调用createObjectStore时FireFox中的IndexedDB错误

调用createObjectStore时FireFox中的IndexedDB错误,firefox,indexeddb,Firefox,Indexeddb,我试图在新登录的indexedDB上调用createObjectStore,并在FireFox中得到此错误:InvalidStateError:在不允许突变的数据库上尝试了突变操作 这是我的密码: var indexed_db = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB; if (indexed_db) { var request = indexed_db.open("Map Tiles", 1

我试图在新登录的indexedDB上调用createObjectStore,并在FireFox中得到此错误:InvalidStateError:在不允许突变的数据库上尝试了突变操作

这是我的密码:

var indexed_db = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB;

if (indexed_db) {
    var request = indexed_db.open("Map Tiles", 1);

    request.onerror = function(event) { };

    request.onsuccess = function(event) {
        var tile_store = event.target.result.createObjectStore("map", {keyPath: ["zoom_level", "tile_column", "tile_row"]});
    };

    request.onupgradeneeded = function(event) { };
}

调用createObjectStore时出错。任何帮助都将不胜感激。

indexedDB基本上有三种类型的事务:readonly、readwrite和versionchange。您可以在readwrite类型的事务中的对象存储中添加/删除对象。从技术上讲,您也可以在Vochange更改中添加/删除对象,但这不是我认为最好的做法。但是,您不能在readwrite/readonly类型事务中创建/删除对象存储或索引(您会遇到此错误)。只能在versionchange事务中创建/删除objectstore/index


您可以直接创建readonly和readwrite类型的事务,但不能创建versionchange。versionchange仅在UpgradeRequired事件回调中发生。实际上,您只能在ONUPGRADE回调中进行更改。因此,正如您的评论所述,在versionchange事务之外进行架构更改(添加/删除存储/索引)会触发此错误,这基本上是OnUpgradeRequired中提供的特殊类型事务之外的所有事务。

看起来createObjectStore只能在OnUpgradeRequired函数中创建。一旦我把代码移到那里,它就停止抛出错误。