未捕获的TypeError不能使用cordova 3.5调用undefined-SQLite插件的方法'opendatabase'

时间:2014-07-14 13:17:07

标签: android jquery sqlite cordova android-sqlite

我不知道为什么会这样。我在我的应用程序中使用Sqlite插件。它工作正常。我能够从DB存储和检索数据。但问题是当我试图在主页上检索数据时(即应用程序起始页面)我收到以下错误,

enter image description here

但如果我在我的应用程序的第二页中使用相同的代码,它工作正常。那么如何填充数据库值应用程序起始页。

代码,

  $( document ).ready(function() {
         redirectHomePage();
    }); 

function redirectHomePage()
{
    alert("go to home page");
     var db = window.sqlitePlugin.openDatabase({name: "test.db"});
     db.transaction(function (tx) {
     tx.executeSql("select distinct Category from Locationlog;", [], function (tx, res) {
     $("#select-choice").empty();
     var optionheading = '<option value="Select Category">Select Category</option>';
     $("#select-choice").append(optionheading);
     alert("length: "+ res.rows.length);
     for (var i = 0; i < res.rows.length; i++)
        {
           var opt  = '<option value="';
           opt += res.rows.item(i).Category;
           opt += '">';
           opt += res.rows.item(i).Category;
           opt += '</option>';
           $("#select-choice").append(opt).selectmenu('refresh');
           $("#locationList").empty();
        }

   });
  });
  $.mobile.changePage('#homePage', "slide", false, true);
}

我的应用程序主页ID是&#34;主页&#34;。我正在使用cordova-3.5在android平台上工作。有关如何在加载第一页之前填充数据库的任何建议。我试过&#34; pageshow&#34;我得到了同样的错误。还有其他方法吗?

enter image description here

1 个答案:

答案 0 :(得分:3)

如果您的项目中未包含 sqlite插件,则代码中的语句将失败。

var db = window.sqlitePlugin.openDatabase({name: "test.db"});

此外,在使用cordova插件之前,您应该等待deviceready事件被解雇 您可以使用 window.openDatabase()调用来创建sqlite DB并且不需要sqlite插件。
以下是在您的app中使用openDatabase调用的代码。

如果您的sqlite插件工作正常,则将db调用更改为。

var db = window.sqlitePlugin.openDatabase({name: "test.db"});

不使用sqlite插件的代码。

// Wait for device API libraries to load
    //
    document.addEventListener("deviceready", onDeviceReady, false);

    // device APIs are available
    //
    function onDeviceReady() {
        var db = window.openDatabase("Database", "1.0", "Cordova Demo", 200000);
        db.transaction(populateDB, errorCB, successCB);
    }

    // Populate the database
    //
    function populateDB(tx) {
        tx.executeSql('DROP TABLE IF EXISTS DEMO');
        tx.executeSql('CREATE TABLE IF NOT EXISTS DEMO (id unique, data)');
        tx.executeSql('INSERT INTO DEMO (id, data) VALUES (1, "First row")');
        tx.executeSql('INSERT INTO DEMO (id, data) VALUES (2, "Second row")');
    }

    // Transaction error callback
    //
    function errorCB(err) {
        alert("Error processing SQL: "+err);
    }

    // Transaction success callback
    //
    function successCB() {
        alert("success!");
    }

以上代码段取自Cordova API文档。有关详细信息,请参阅here。即使文档是3.0,它应该适用于3.5