2016-03-06 43 views
0

再次,我对indexeddb有一些问题。 I'm得到一个indexeddb调用堆栈的状态错误无效?

InvalidStateError: A Mutation operation was attempted on a database that did not allow mutations.

和也是一个

AbortError 

这里是我的代码:

DB_LINK.prototype.pushStoreNumeric = function() 
{ 
    // Saving Values 
    var _temp = 0; 
    var _version = this.link.version; 
    var _name = this.link.name; 
    var that = this; 
    var _objectStoreNames = this.link.objectStoreNames; 

    // Close DB 
    this.link.close(); 
    this.state = 4; 

    // Reopen Database  
    this.req = indexedDB.open(_name,_version+1); // Abort error here 
    this.req.onupgradeneeded = function() { 
    that.state = 1; 


    // Get Number of object stores 
    _temp = _objectStoreNames.length; 

    if(_temp != 0) 
    { 
     // Already object stores: read highest value 
     _temp = parseInt(_objectStoreNames[_objectStoreNames.length - 1]); 
    } 
    that.link.createObjectStore(_temp); // InvalidStateError here 
}; 

我根据注释已标记那里发生的错误。

InvalidStateError首先发生,AbortError如下。

我在同一个数据库的另一个onsuccess函数内调用这个函数。这可能是问题吗?

回答

1

什么是this.link?这可能是问题所在。您需要对由indexedDB.open请求创建的数据库实例执行createObjectStore。所以无论是this.req.result.createObjectStore或(如果您更改为this.req.onupgradeneeded = function (e) {),您可以使用e.target.result.createObjectStore

更一般地说,我不能真正评论你的代码应该做什么,因为我只能看到一个代码片段,但是每次调用这个代码时你看起来真的很奇怪。可能你实际上并不想这么做。您可能需要阅读更多文档。

+0

谢谢,你指出了这个问题。 'this.link' _was_我的链接到数据库,在我关闭它之前。我没有在'this.link'中存储新链接,这与'that.link'相等(因为在所示代码中'var that = this')。我通常想要做的就是使用这个功能,为数据库添加一个新的商店。数据库中的商店有数字名称(由我定义),现在这个代码工作!而且,因为我只能在versionchange事务中创建新的商店,所以我必须增加数据库的版本 - 所以这是正确的。谢谢! – erik