2012-07-07 66 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