眼眸繁星
2023-07-14 17:25:28
我正在構建一個應用程序,我想在每次加載頁面時嘗試從數據庫中重新提取數據。如果沒有網絡連接,那么我將使用 IndexedDB 中存儲的數據。為此,我認為在 window.indexedDB.open 函數的 onsuccess 事件中清除現有的對象存儲,然后使用新數據重新創建是有意義的。像這樣的東西:var request = window.indexedDB.open("offlineInspections",1); request.onsuccess = function(event){ db = request.result; //Check if connected to network //If yes, pull new data // TODO (will use AJAX to make a server call) //Check if current data exists //If yes, delete if(db.objectStoreNames.contains("user")){ db.deleteObjectStore("user"); } //Load new data var userStore = db.createObjectStore("user",{keyPath: "id"}); //Throws error var transaction = event.target.transaction; transaction.oncomplete = function(event){ console.log('New user store created'); }}當我嘗試運行此程序時,我在上面提到的行中收到以下錯誤:未捕獲的 DOMException:嘗試對不允許突變的數據庫進行突變操作。
1 回答

胡說叔叔
TA貢獻1804條經驗 獲得超8個贊
您只能在 onupgradeneeded 事件處理函數中更改數據庫的對象存儲和索引,該函數在版本更改讀寫事務的上下文中運行。
onupgradeneeded 事件處理程序與成功打開請求事件處理程序不同。成功的打開事件處理程序不允許對對象存儲或索引進行更改。成功事件僅在升級事務完成后發生。到那時,您正在嘗試對不允許突變(在版本更改事務的上下文之外)的數據庫進行突變操作(創建/刪除對象存儲的命令)。
解決方案是使用 onupgradeneeded 處理程序:
var request = indexedDb.open(...);
request.onupgradeneeded = function(event) {
// do database changes here, e.g.
var db = event.target.result;
db.createObjectStore(...);
};
request.onsuccess = function(event) {
// do database reads/writes here
// you cannot use createObjectStore here
};
添加回答
舉報
0/150
提交
取消