在'IDBDatabase'上执行'createObjectStore'失败。

29

为什么会出现错误?

我的代码:

var idb = window.indexedDB ||      // Use the standard DB API
          window.mozIndexedDB ||   // Or Firefox's early version of it
          window.webkitIndexedDB;  // Or Chrome's early version

var IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction;
var IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange;

var dbName='nameDb';

var idbRequest=idb.open(dbName,'4.67' /*,dbDescription  */);

idbRequest.onsuccess=function (e) {
    debugger

    var db=e.target.result; 

    if (!db.objectStoreNames.contains('chat')){
        co=db.createObjectStore('chat',{'id':100});
    };

    if (!db.objectStoreNames.contains('iam')){
        co1=db.createObjectStore('iam');
    }; 
};

idbRequest.onerror = function (e) {
    debugger
};

未捕获的InvalidStateError错误:在“IDBDatabase”上执行“createObjectStore”失败:数据库未运行版本更改事务。index.html:37 idbRequest.onsuccess


1
“Що це за” - 是什么意思? :D - nicael
我理解你所有的评论,除了这个 :-) - nicael
1个回答

52
您不能在 onsuccess 方法中创建一个 objectStore,只能在 upgradeneeded 事件中执行此操作。
引用文档:

当您创建新的数据库或增加现有数据库的版本号(通过比之前指定更高的版本号打开数据库),将触发 onupgradeneeded 事件。在此事件的处理程序中,您应该创建所需版本数据库的对象存储。

请参见文档

1
如果在 onupgradeneeded 中填充数据失败会怎么样? - user1663023
2
那我应该在onsuccess中进行数据验证,如果数据无效,则使用更高版本打开数据库以再次触发onupgradeneeded吗? - user1663023
user1663023,请将“db version”视为表/字段集。您只能在onupgradeneeded事件中更改此集合。 - Denis Maslov
你可以在onsuccess事件中读取/写入数据,同样也可以在onupgradeneeded事件中进行操作。 - Denis Maslov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接