我有一个使用indexedDB的应用程序(调查问卷)。 我们有一个数据库,里面有几个商店。
商店中已经存储了数据。
在某个时刻,仪表板 html 文件会被加载。在这个文件中,我调用了几个函数:
function init(){
adjustUsedScreenHeight();
db_init();
setInstitutionInstRow();
loadRecommendations();
loadResultsFromDB();
fillEvaluations();
document.addEventListener("deviceready", onDeviceReady, function(e) {console.log(e);});
}
init() 函数在 body onLoad 上调用。
setInstitutionInstRow() 看起来像这样:
function setInstitutionInstRow(localId){
//localId = 10;
if (localId == undefined){
console.log("Localid underfined: ");
//open db, open objectstore;
var request = indexedDB.open("kcapp_db", "1.0");
request.onsuccess = function() {
var db = request.result;
var tx = db.transaction ("LOCALINSTITUTIONS", "readonly");
var store = tx.objectStore("LOCALINSTITUTIONS");
tx.oncomplete = function(){
db.close();
}
tx.onerror = function(){
console.log("Transaction error on setInstInstRow");
}
var cursor = store.openCursor();
cursor.onsuccess= function () {
var match = cursor.result;
console.log ("Retrieved item: " + match.value.instid);
// alert("Added new data");
if (match){
setInstituionInstRow(match.value.instid);
console.log("Got localid: " + math.value.instid);
}
else
console.log("localinsid: it is empty " );
};
cursor.onerror = function () {
console.log("Error: " + item.result.errorCode);
}
}
request.onerror = function () {
console.log("Error: " + request.result.errorCode );
}
request.oncomplete = function (){
console.log("The transaction is done: setInstitutionRow()");
}
request.onupgradeneeded = function (){
console.log("Upgrade needed ...");
}
request.onblocked = function(){
console.log("DB is Blocked ...");
}
} else {
instid = localId;
var now = new Date();
//console.log("["+now.getTime()+"]setInstituionInstRow - instid set to "+localId);
//open db, open objectstore;
var request = indexedDB.open("kcapp_db", "1.0");
request.onsuccess = function() {
var db = this.result;
var tx = db.transaction ("INSTITUTIONS", "readonly");
var store = tx.objectStore("INSTITUTIONS");
var item = store.get(localId);
console.log(item);
item.onsuccess= function () {
console.log ("Retrieved item: ");
if (item.length > 0)
var lInstitution = item.result.value;
kitaDisplayValue = lInstitution.krippe;
};
item.onerror = function () {
console.log("Error: " + item.result.errorCode);
}
}
request.onerror = function () {
console.log("Error: " + request.result.errorCode );
}
}
现在的问题是,
var request = indexedDB.open("kcapp_db", "1.0");
上述请求永远不会进入任何 onsuccess、oncomplete、onerror 状态。我使用 Chrome 工具进行调试,它从未进入任何上述状态。
因此,我没有从交易中获取任何数据。
Chrome 控制台中没有错误。
这是来自 Chrome 开发人员的请求值:
从上图中,readyState:done,这意味着它应该触发一个事件(成功、错误、阻塞等)。但它不会涉及其中任何一个。
我正在研究它,但仍然无法弄清楚为什么它不起作用。
必须提到 init() 中的其他函数的行为方式相同。
期待获得一些帮助。
最佳答案
您可能在 open 函数中使用了无效的版本参数。尝试使用 indexedDB.open('kcapp_db', 1);
代替。
关于javascript - IndexedDB 打开数据库请求奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28217985/