HTML5-indexedDB使用常見錯誤總結

indexedDB使用過程當中的錯誤1:web

Failed to execute ‘createObjectStore’ on ‘IDBDatabase’: The database is not running a version change transaction.

 

這是因爲你在success事件的回調中調用createObjectStore方法,該方法應該在upgradeneeded事件的回調中調用。chrome

\\獲取indexedDB對象
const indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB; \\打開數據庫,在回調中建立store object const request = indexedDB.open(DBName, version); request.onsuccess = (e) => { this.db = e.target.result; }; request.onupgradeneeded = (e) => { this.db = e.target.result; if(!this.db.objectStoreNames.contains(storeName)){ this.store = this.db.createObjectStore(storeName, { keyPath: 'key'}); }

 


}
request.onerror = (e) => {console.log('Can not open indexedDB', e);};

錯誤2:數據庫

Failed to exectue ‘transaction’ on ‘IDBDatabase’: One of the specified stores was not found.

 

這是由於upgradeneeded事件沒有被觸發。 
這裏須要注意upgradeneeded事件。首先,根據API,應該在upgradneeded事件的回調函數中調用createObjectStore方法建立store object,不該該在success的回調中,不然會報錯。其次,當爲open方法傳入一個本域沒有的數據庫名時,會建立相應的數據庫,並觸發success、upgradeneeded事件,從而建立一個store object。可是,chrome54並不會觸發upgradeneeded事件,形成store object不會被建立,後續在store object上建立事務並操做數據時候就會報錯。Stackoverflow上提供的解決辦法是,在open方法傳入第二個參數(與已有version不一樣,且更大),這樣就會觸發chrome上的upgradeneeded事件了。不過,每次都須要調用db.version獲取當前的版本號。異步

另外可能出現的一個錯誤是:函數

Cannot read property ‘createObjectStore’ of undefined

 

這是由於indexedDB是異步的,你必須在回調函數中使用createObjectStore方法,即便你把createObjectStore調用寫在open函數後面,也沒法保證哪一個先完成。
--------------------- 
做者:柒青衿 
來源:CSDN 
原文:https://blog.csdn.net/qiqingjin/article/details/53263261 
版權聲明:本文爲博主原創文章,轉載請附上博文連接!this

相關文章
相關標籤/搜索