我使用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);
});
答案 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来阅读它。