2016-03-06 46 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