为了账号安全,请及时绑定邮箱和手机立即绑定

使用 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 关注
  • 82 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信