2011-08-27 22 views
1

我有以下工作集的功能,我從phonegap API(http://docs.phonegap.com/phonegap_storage_storage.md.html#Database) :phonegap中的數據庫交互的澄清(使用W3C Web SQL)

function onDeviceReady() { 
     //Phonegap is ready. Open up the database and fill with data 
     // 
     var db = window.openDatabase("Database", "1.0", "PhoneGap Demo", 200000); 
     db.transaction(populateDB, errorCB, successCB); 

} 


    // Transaction success callback 
    // 
    function successCB() { 
     //Database opened succesfully - now choose the database again 
     var db = window.openDatabase("Database", "1.0", "PhoneGap Demo", 200000); 
     //Execute an SQL transaction against it. The successful results of 
     //this transaction will be in querySuccess function below 
     db.transaction(queryDB, errorCB); 
    } 

    // Transaction error callback 
    // 
    function errorCB(err) { 
     console.log("Error processing SQL: "+err.code); 
    } 

    // Populate the database 
    // 
    function populateDB(tx) { 
     tx.executeSql('DROP TABLE IF EXISTS PAGES'); 
     tx.executeSql('CREATE TABLE IF NOT EXISTS PAGES (id unique, data)'); 
     tx.executeSql('INSERT INTO PAGES (id, data) VALUES (1, "First page")'); 
     tx.executeSql('INSERT INTO PAGES (id, data) VALUES (2, "Second page")'); 
    } 

    // Query the database 
    // 
    function queryDB(tx) { 
     tx.executeSql('SELECT * FROM PAGES', [], querySuccess, errorCB); 
    } 


    // Query the success callback 
    // 
    function querySuccess(tx, results) { 
     var len = results.rows.length; 
     alert("DEMO table: " + len + " rows found."); 
     for (var i=0; i<len; i++){ 
      alert("Row = " + i + " ID = " + results.rows.item(i).id + " Data = " + results.rows.item(i).data); 
     } 
    } 

看着那個。我是否正確地說數據庫是每次應用程序被加載時創建的?這對我來說沒有意義,但也許這是做到這一點的唯一方法?除非我編寫了錯誤代碼

+0

我不認爲每次打開數據庫時都會重新創建數據庫,從webkit StickyNotes演示應用程序的行爲來看,它顯示數據庫打開時的現有記錄(當然存在)。 API的OpenDatabase方法必須在數據庫不存在的情況下創建數據庫,並且只要打開數據庫即可。雖然我不知道如果隨後打開的電話上的尺寸參數小於或大於第一次,會發生什麼情況。我不會在成功處理程序中重新開放。上面的代碼似乎多次填充。 – Tim

+0

如果我沒有在成功處理程序中重新打開它,它根本不起作用:/嗯.. – Billie

+0

'var db = null;'onDeviceReady以外需要;然後db = window.openDatabase ....在函數內部。範圍問題。 – Tim

回答

0

與在調用之下直接調用您的填充方法相比,將事件監聽器附加到db的加載事件。

var db = null; 

function openDB() {db = ... }; 

. 
. 
. 

if (db != null) 
     addEventListener('load', loaded, false); 

然後用事件處理程序中的db.load事件的初始數據填充數據庫。

+0

我不能完全弄清楚你的語法。我已經提出了以下內容,但它並沒有很好的工作: – Billie

+0

添加到上述答案的代碼 – Billie