无法使用查询从Sqlite DB获取值

时间:2012-07-07 15:11:50

标签: javascript html sqlite

我使用sqlite来填充包含一些表的数据库。 我在另一个执行数据库&的javascript页面上创建了一个函数。从表中选择一些值。该函数在$(document).ready()处调用。

Javascript:

 //DB Population
function onDeviceReady() {
    var db = window.openDatabase("Database", "1.0", "SqliteTrial", 20000);
    db.transaction(populateDB, errorCB, successCB);
}

function populateDB(tx) {
tx.executeSql('DROP TABLE IF EXISTS Subjects');
tx.executeSql('CREATE TABLE IF NOT EXISTS Subjects (id unique, subjectname)');
tx.executeSql('INSERT INTO Subjects (id, subjectname) VALUES (1, "Math")');
tx.executeSql('INSERT INTO Subjects (id, subjectname) VALUES (2, "Science")');
}  

function GetSubjectsFromDB()
{
    console.log("");
    tx.executeSql('SELECT * FROM Subjects', [], queryNSuccess, errorCB);
}

function queryNSuccess(tx, results) {
    alert("Query Success");
    console.log("Returned rows = " + results.rows.length);
    if (!results.rowsAffected) {
        console.log('No rows affected!');
        return false;
    }
    console.log("Last inserted row ID = " + results.insertId);
}

function errorCB(err) {
    alert("Error processing SQL: "+err.code);
}

这条线路有问题吗?

tx.executeSql('SELECT * FROM Subjects', [], queryNSuccess, errorCB);

没有调用queryNSuccess,也没有调用errorCB所以我不知道什么是错的。

这是我在另一个页面上调用它的方式:

Javascript:

     $(document).ready(function () {
            DisplayData();
            GetSubjectsFromDB(tx);
        });

1 个答案:

答案 0 :(得分:1)

不,它不会那样工作。 tx变量实际上是一个参数,它将通过db.transaction方法发送到指定的回调函数中。所以你可能想要这样做:

$(document).ready(function () {
    ...
    db.transaction(GetSubjectsFromDB);            
});

...并将此函数定义重写为...

function GetSubjectsFromDB(tx) { ... something to do with tx ... }

但实际上还有另一个问题,正如我所看到的那样。存储连接句柄(由db调用创建)的window.openDatabase变量是onDeviceReady函数的本地变量 - 换句话说,它在此函数外部不可见。

解决此问题的最简单方法是在Global上下文中定义此变量:

var dbh; // the SQLite connection handle
function onDeviceReady() { ... dbh = window.openDatabase ... }
function GetSubjects() { ... dbh.transaction(getSubjectsFromDb) ... }
function getSubjectsFromDb(tx) { ... tx.executeSql(...) ... }

这是描述WebSQL DB的一般用法的一个很棒的presentation。但我还想补充说,WebSQL DB API被认为已被弃用;建议改用IndexedDB。这是something来阅读它。