我使用 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);
});
最佳答案
不,它不是那样工作的。 tx
变量实际上是一个参数,将被db.transaction
方法发送到指定的回调函数中。所以你可能想改为这样做:
$(document).ready(function () {
...
db.transaction(GetSubjectsFromDB);
});
... 并将此函数定义重写为...
function GetSubjectsFromDB(tx) { ... something to do with tx ... }
但在我看来,实际上还有另一个问题。存储连接句柄(由 window.openDatabase
调用创建)的 db
变量是 onDeviceReady
函数的本地变量 - 换句话说,它不是在此函数之外可见。
解决此问题的最简单方法是在全局上下文中定义此变量:
var dbh; // the SQLite connection handle
function onDeviceReady() { ... dbh = window.openDatabase ... }
function GetSubjects() { ... dbh.transaction(getSubjectsFromDb) ... }
function getSubjectsFromDb(tx) { ... tx.executeSql(...) ... }
这是一个很棒的presentation描述 WebSQL DB 的一般用法。但我还想补充一点,WebSQL DB API 被认为已弃用;建议改用 IndexedDB。这是 something阅读它。
关于javascript - 无法使用查询从 Sqlite 数据库获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11376126/