Cordova SQLite插件仅在第一次调用时有效

Cordova SQLite plugin only works on first call

本文关键字:调用 有效 第一次 SQLite 插件 Cordova      更新时间:2023-09-26

我有一个科尔多瓦应用程序,有两个页面,第一个页面有一个搜索字段,第二个显示第一个页面的结果。displayResults函数

function displayResults(){
    var query = localStorage.getItem('search');
    var db = window.sqlitePlugin.openDatabase({name:"Store-DB", location: 1});
    queryDB(db,query);
    }
function queryDB(db,query){
    db.transaction(function(tx) {
            var queryList = query.split(" ");
            var sqlText = "SELECT * FROM DB WHERE item LIKE '%"+queryList[0]+"%'";
            for (i = 1; i < queryList.length; i++) {
                    sqlText += " OR item LIKE '%"+queryList[i]+"%'";
            }
            tx.executeSql(sqlText, [], querySuccess);
        }
        );
    }
function querySuccess(tx,results) {
    var i;
    var len = results.rows.length;
    //Iterate through the results
    for (i = 0; i < len; i++) {
        console.log(row);
        //Get the current row
        var row = results.rows.item(i);
        var div = document.createElement("div");
        div.style.background = "gray";
        div.style.color = "white";
        div.innerHTML = row;
        document.body.appendChild(div);
    }
    alert("Finished");
}

这是第二页的代码:

    <link rel="stylesheet" type="text/css" href="css/default.css">
    <script type="text/javascript" charset="utf-8" src="cordova.js"></script>
    <script src="js/zepto.js" type="text/javascript"></script>
    <script src="plugins/com.brodysoft.sqlitePlugin/www/SQLitePlugin.js" type="text/javascript"></script>
    <script src="js/code.js" type="text/javascript"></script>
    <script type="text/javascript">
        function onLoad(){
            document.addEventListener("deviceready", onDeviceReady(), false);
        }
        function onDeviceReady(){
            displayResults();
        }
    </script>
    </head>
    <body onload="onLoad()">
        <div id="taskbar">
            <a href="index.html">Home</a>
            <a id="username" class="toolbar_item" style="float:right;"  href="#"></a>
        </div>

第一次加载此页面时displayResults工作正常,但是如果您单击链接返回主页并再次加载第二个页面,控制台会打印错误ReferenceError: no "undefined" has no property "openDatabase"换句话说,SQLite插件未加载。但是,如果我在按下按钮而不是onload时触发displayResults它每次都有效。这种特殊行为的解释是什么?

似乎有时 deviceready-event 要么根本不触发,要么在有更多不同库的事件处理程序时过早触发。第二个问题导致 brodysoft-plugin 未正确加载并作为 window.sqlitePlugin 属性分配给窗口对象,因为一个事件处理程序过早地调度了 deviceready-event。事实证明,setTimeout就是答案,因为它一直在这里

例如,您可以使用onpageshow事件

$('#idofyourpage').bind("onpageshow",function(){
   //Do something
});