2012-07-07 99 views
2

从Sqlite DB获取值我使用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不被调用,也不是错误CB,所以我不知道错在哪里。

这是我如何把它在另一页:

的Javascript:

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

“tx”是如何初始化的?控制台中是否有任何错误报告? – Pointy 2012-07-07 15:16:28

+0

我把tx的代码。在控制台中找不到错误。 – 2012-07-07 22:41:41

+0

我没有看到设置了“tx”的代码。 – Pointy 2012-07-07 22:49:32

回答

1

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

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

...并重写这个函数定义...

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

但还有另一个问题,实际上,当我看到它。您的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来阅读它。

+0

感谢万@ raina77ow ...你的答案真的很有用。 – 2012-07-09 11:44:05