Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用IndexedDB,是否可以在window.IndexedDB.open的onsuccess事件中创建对象存储?_Javascript_Indexeddb - Fatal编程技术网

Javascript 使用IndexedDB,是否可以在window.IndexedDB.open的onsuccess事件中创建对象存储?

Javascript 使用IndexedDB,是否可以在window.IndexedDB.open的onsuccess事件中创建对象存储?,javascript,indexeddb,Javascript,Indexeddb,我正在构建一个应用程序,希望在每次加载页面时尝试从数据库中重新提取数据。如果没有网络连接,那么我将使用IndexedDB中存储的数据 为此,我认为有必要清除window.indexedDB.open函数的onsuccess事件中现有的objectstores,然后使用新数据重新创建。大概是这样的: var request = window.indexedDB.open("offlineInspections",1); request.onsuccess =

我正在构建一个应用程序,希望在每次加载页面时尝试从数据库中重新提取数据。如果没有网络连接,那么我将使用IndexedDB中存储的数据

为此,我认为有必要清除window.indexedDB.open函数的onsuccess事件中现有的objectstores,然后使用新数据重新创建。大概是这样的:

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');
    }
}
当我尝试运行此操作时,在上面提到的行中出现以下错误:

未捕获DomeException:在不允许突变的数据库上尝试了突变操作


您只能在ONUPGRADEED事件处理程序函数中更改数据库的对象存储和索引,该函数在版本更改读写事务的上下文中运行

OnUpgradeRequired事件处理程序与成功打开请求事件处理程序不同。不允许成功的打开事件处理程序更改对象存储或索引。成功事件仅在升级事务完成后发生。此时,您正在尝试对不允许突变的数据库执行突变操作(创建/删除对象存储的命令)(在版本更改事务的上下文之外)

解决方案是使用ONUPGRADE所需的处理程序:

var请求=indexedDb.open(…);
request.onupgradeneeded=函数(事件){
//在此处进行数据库更改,例如。
var db=event.target.result;
db.createObjectStore(…);
};
request.onsuccess=函数(事件){
//是否在此处执行数据库读/写操作
//不能在此处使用createObjectStore
};