Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.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中只添加一次初始数据_Javascript_Indexeddb - Fatal编程技术网

Javascript 如何在indexeddb中只添加一次初始数据

Javascript 如何在indexeddb中只添加一次初始数据,javascript,indexeddb,Javascript,Indexeddb,我正在创建一个indexeddb,其中有几个商店。 在创建存储时必须首先添加一些数据 我有创建数据库和存储的功能: 函数db_init(){ var请求=indexedDB.open(“db”,“1.0”); request.onupgradeneeded=函数(){ var db=request.result; //商店1 createObjectStore(“store1”,{keypath:“id”,autoIncrement:true}); //添加初始数据; //仓库2 createO

我正在创建一个indexeddb,其中有几个商店。 在创建存储时必须首先添加一些数据

我有创建数据库和存储的功能:

函数db_init(){ var请求=indexedDB.open(“db”,“1.0”); request.onupgradeneeded=函数(){ var db=request.result; //商店1 createObjectStore(“store1”,{keypath:“id”,autoIncrement:true}); //添加初始数据; //仓库2 createObjectStore(“store2”,{keypath:“id”,autoIncrement:true}); //... //商店3 //初始化必要的数据库 db_populate(); } request.onsuccess=函数(){ db=请求。结果; 填充:db(); } } 在db_populate函数中,还有另外4个函数,我在其中填充数据存储:

 function db_populate() {

    init_store1();
    init_store2();
    //...

     console.log("db populated with data");
 }
每个init_分数使用如下事务填充存储:

 var tx = db.transaction("store1", "readwrite");
 var store = tx.objectStore("store1");
现在,我有个问题。每次打开或刷新页面时,初始数据都会重复。这里又加了一次

当我在
onupgradeneeded
函数末尾添加db_populate时,我得到一个错误:

  Uncaught TypeError: Cannot read property 'transaction' of undefined
在线:

  var tx = db.transaction ("store1", "readwrite");
我试图实现的是用初始数据创建一次数据存储,就是这样

知道我做错了什么吗


提前谢谢

这是因为您无法在需要升级的事件中插入数据。您需要做的是在升级后关闭连接,然后重新打开连接以进行数据插入

流程应该是这样的:

函数db_init(){ var请求=indexedDB.open(“db”); var dbShouldInit=false; request.onupgradeneeded=函数(e){ var db=e.target.result; dbShouldInit=true; //商店1 db.createObjectStore(“store1”{ 密钥路径:“id”, 自动递增:真 }); //添加初始数据; //仓库2 db.createObjectStore(“store2”{ 密钥路径:“id”, 自动递增:真 }); } request.onsuccess=函数(e){ e、 target.result.close(); if(dbShouldInit)//仅在发生DB init时执行 db_populate();//首先关闭数据库,然后调用init } } 函数db_populate(){ init_store1(init_store2);//将init 2作为回调传递 } 函数init_store1(回调){ var请求=indexedDB.open(“db”); request.onsuccess=函数(e){ var db=e.target.result; var tx=数据库事务(“存储1”、“读写”); var store=tx.objectStore(“store1”); //初始化代码在这里 tx.oncomplete=函数(e){ callback();//这里调用第二个函数的init }; } } 函数init_store2(){ var请求=indexedDB.open(“db”); request.onsuccess=函数(e){ var db=e.target.result; var tx=数据库事务(“存储2”,“读写”); var store=tx.objectStore(“store2”); //初始化代码在这里 tx.oncomplete=函数(e){ //在这里,应用程序可以继续 }; } }
(函数(){
//indexedDB.deleteDatabase(“存储”);
var openDB=indexedDB.open(“存储”,1);
openDB.onupgradeneeded=函数(){
var db=openDB.result;
var存储;
如果(!db.objectStoreNames.contains(“示例”)){
store=db.createObjectStore(“示例”{keyPath:“some”});
put({some:“initData”});
}
};
openDB.onsuccess=函数(e){
var db=e.target.result;
var rqst=db.transaction(“示例”,“只读”)
.objectStore(“示例”)
.get(“initData”);
rqst.onsuccess=函数(e){
控制台日志(rqst.result);
};
};

})();虽然有点奇怪,但是如果我在创建存储之后立即添加数据呢?至少在例子1中,他们做到了。如果我有两个以上的init函数呢?如何添加回调?您可以传递函数数组,并执行所有函数them@user3185491这个答案对你的问题有帮助吗?没有,我在数组中添加了函数作为对第一个init_存储的回调,它不再看到db变量。