我有一个使用indexedDB的app(问卷)。 我们有一个数据库和几个商店。
商店已经存储了数据。
在某些时候加载了仪表板html文件。在这个文件中,我称之为几个函数:
function init(){
adjustUsedScreenHeight();
db_init();
setInstitutionInstRow();
loadRecommendations();
loadResultsFromDB();
fillEvaluations();
document.addEventListener("deviceready", onDeviceReady, function(e) {console.log(e);});
}
在body onLoad上调用init()函数。
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");
上述请求永远不会进入任何onccess,oncomplete,onerror状态。我使用Chrome工具进行了调试,它从未涉及任何上述状态。
因此,我没有从交易中获得任何数据。
Chrome控制台中没有错误。
以下是Chrome开发人员的请求值:
从上面的图像中,readyState:done,这意味着它应该触发一个事件(成功,错误,阻塞等)。但它没有进入其中任何一个。
我正在研究它,但仍然无法弄清楚它为什么不起作用。
不得不提到init()中的其他函数的行为方式相同。
期待得到一些帮助。
答案 0 :(得分:1)
您可能正在使用open函数的无效版本参数。请改为indexedDB.open('kcapp_db', 1);
。
答案 1 :(得分:1)
success
,error
,upgradeneeded
或blocked
。为所有这些添加事件侦听器(例如request.onblocked = ...
)并查看哪一个被触发。答案 2 :(得分:0)
我有这个问题,但只有“onupgradeneeded”事件。我修改了它更改“打开”功能的名称。起初我有一个很长的名字;我改了一小段就开始工作了。我不知道这是不是真正的问题,但那时它已经解决了。
我的代码:
if (this.isSupported) {
this.openRequest = indexedDB.open("OrdenesMant", 1);
/**
* Creación de la base de datos con tablas y claves primarias
*/
this.openRequest.onupgradeneeded = function(oEvent) {
...
希望它也适合你。