2

我使用 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);
        });
4

1 回答 1

1

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

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

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

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

但在我看来,实际上还有另一个问题。db存储连接句柄(通过window.openDatabase调用创建)的变量对于函数是本地的-onDeviceReady换句话说,它在此函数之外不可见。

解决这个问题的最简单方法是在全局上下文中定义这个变量:

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

这是一个很棒的演示文稿,描述了 WebSQL DB 的一般用法。但我还想补充一点,WebSQL DB API 已被弃用;建议改用 IndexedDB。这里有一些关于它的阅读。

于 2012-07-08T17:01:24.187 回答