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 createObjectStore(“store2”,{keypath:“id”,autoIncrement:true}); //... //商店3 //初始化必要的数据库 db_populate(); } request.onsuccess=函数(){ db=请求。结果; 填充:db(); } } 在db_populate函数中,还有另外4个函数,我在其中填充数据存储: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
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变量。