IndexedDB打开DB请求奇怪的行为

时间:2015-01-29 15:10:53

标签: javascript indexeddb

我有一个使用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开发人员的请求值:

enter image description here

从上面的图像中,readyState:done,这意味着它应该触发一个事件(成功,错误,阻塞等)。但它没有进入其中任何一个。

我正在研究它,但仍然无法弄清楚它为什么不起作用。

不得不提到init()中的其他函数的行为方式相同。

期待得到一些帮助。

3 个答案:

答案 0 :(得分:1)

您可能正在使用open函数的无效版本参数。请改为indexedDB.open('kcapp_db', 1);

答案 1 :(得分:1)

  1. 和Josh说的一样,你的版本参数应该是一个整数,而不是一个字符串。
  2. 您的请求对象可以响应打开的请求获得4个事件:successerrorupgradeneededblocked。为所有这些添加事件侦听器(例如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) {
...

希望它也适合你。