亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 IndexedDB,是否可以在 window.indexedDB.open

使用 IndexedDB,是否可以在 window.indexedDB.open

眼眸繁星 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

};


查看完整回答
反對 回復 2023-07-14
  • 1 回答
  • 0 關注
  • 111 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號