2012-01-08 40 views
3

從教程這樣的代碼我怎麼能傳遞參數,在交易的回調函數

function queryDB(tx) { 
    tx.executeSql('SELECT * FROM DEMO', [], querySuccess, errorCB); 
} 

function querySuccess(tx, results) { 

} 

function errorCB(err) { 
    alert("Error processing SQL: "+err.code); 
} 

var db = window.openDatabase("Database", "1.0", "PhoneGap Demo", 200000); 
db.transaction(queryDB, errorCB); 

在db.transaction我想通過一個變量作爲參數傳遞給queryDB功能,所以我認爲的代碼應外觀像

db.transaction(queryDB(id), errorCB); 

我該如何實際執行此操作?或者它只是簡單的像這樣工作,我的ID會通過並得到tx?

回答

6

再次把它包在一個函數

var id = 'THEID'; 
db.transaction(function(){ 
    queryDB(id) 
}, errorCB); 

注意 - 這是假設你正在做的API。一些API /框架自動插入所需的信息。例如

//the db.transaction method 
function transaction(param, callback) { 
    //do code stuff 
    callback(someInternalId); //callback is the function you pass as the first parameter 
} 

所以,如果您想在回調中傳遞自己的數據,請將其包裝在一個函數中。否則,您使用的代碼可能會自動爲您執行此操作。

+0

所以確實在queryDB()函數我會得到價值與tx.id的ID? *我正在使用phonegap – cjmling 2012-01-08 07:18:11

+0

就像我說的那樣,這取決於phonegap的API(我沒有使用它)。是'tx'你想傳遞給queryDB的值嗎?或者您期望API填寫的方法(如事務ID)。如果你想傳遞它,你可以使用上面詳述的方法。 – JohnP 2012-01-08 07:30:02

+0

'tx'可能是一個方法,API會填補我的猜測,http://dev.w3.org/html5/webdatabase/#sqltransactioncallback ....所以如果我想傳遞它,那麼我如何檢索值ID ..是由tx.id嗎? – cjmling 2012-01-08 08:59:37

2

好吧首先是創建一個類的帽子會處理你數據庫實例(DB更新等),該類會認爲你將使用所有你查詢的

self.db = window.openDatabase(// and so on 

那麼函數的函數:

// execute a query and fetches the data as an array of objects 
self.executeQuery = function(string, args, callback, callbackparams) { 
    var self = this; 
    //console.log('db execute: '+string); 
    self.db.transaction(function(tx) { 
     tx.executeSql(string, args, function(tx, result) { 
      var retval = []; 
      for (var i = 0; i < result.rows.length; ++i) { 
       retval.push(result.rows.item(i)); 
      } 
      if (callback) { 
       callback(retval, result, callbackparams); 
      } 

     }, self.error); 
    }); 
} 

然後當你發起你是類(我把它命名爲myDb)去apeshit!

myDb.executeQuery('select l.* from location l inner join item_location il on (il.location_id = l.id and il.item_id = ?)', [item.id], function(locations, res, item){ 
       item.locations = locations; 
       myDb.executeQuery('select * from media where item_id = ?', [item.id], function(media, res, item){ 
        item.media = media; 
        // create item. 
        createItem(item);      
       }, item); 
      }, item); 

,你可以看到的executeQuery有4個參數,可以 查詢, PARAMS查詢, 回調(3個PARAMS,結果,狀態和myparam) myparam(回調)

花我有一段時間來解決這個問題,但是當你這樣做的時候!沒有更煩人的數據庫恐怖!

+0

謝謝你的解釋雷內,但你能解釋你爲什麼要打2個查詢?你有一個簡單的例子嗎? – 2012-07-04 19:54:55

0

我們無法發送任何paramenter對於喜歡「queryDB(ID)」 queryDB功能

我通過這種方式解決了這個問題。

var contactId = 33 
dbInst.transaction(function(tx){ 
    tx.executeSql('CREATE TABLE IF NOT EXISTS CONTACT_REFERENCE (id unique)'); 
    var sqlStr = 'INSERT INTO CONTACT_REFERENCE (id) VALUES (?)' 
    tx.executeSql(sqlStr, [contactId]); 
}, errorCB, successCB); 
0

我想每個人都接近回答你的問題。真的,你需要對JohnP的答案稍作修改。你應該傳入帶有executeSQL函數的SQLTransaction對象。因此,要建立在約翰的回答是:

var id = 'THEID'; 
db.transaction(function(tx){ 
    queryDB(tx, id) 
}, errorCB); 

然後在其中定義,你可以用一個額外的變量抓住你的ID PARAM功能。

queryDB: function (tx, id) { ...your code... } 
6

我喜歡讓事情變得很簡單,所以我使用的功能數量有限,在可以接收參數的PhoneGap應用程序中處理存儲時。很多我看到的例子都調用了許多子函數,對於我來說,調試時這是一場噩夢。

我被Web SQL遇到了一些問題,但是閱讀規範確實有助於澄清我可以做什麼和不可以做什麼。 (http://www.w3.org/TR/webdatabase/

看看這個簡單的代碼插入函數:

function dbInsert(param1, param2, dbObj) { 
    val1 = param1; 
    val2 = param2; 
    val3 = String(dbObj.item2); 

    var sqlTxt = "INSERT INTO demo (geo1, geo2, geo3) VALUES (?, ?, ?)"; 
    db.transaction(function(tx) {tx.executeSql(sqlTxt,[val1,val2,val3])}, errorCB, successCB); 
    } 

就讓我們通過它走。很明顯,一個接收參數的標準函數可以是任何東西,在這種情況下也是一個對象以及一個字符串。

sqlTxt是樂趣開始的地方。按照通常寫入插入語句的方式寫入,但通常在VALUES中使用要將數據傳遞到數據庫表中的每個字段的佔位符。

現在,讓我們打破了下一行:

db.transaction(function(tx) {tx.executeSql(sqlTxt,[val1,val2,val3])}, errorCB, successCB); 

當您創建一個新的數據庫,db是處理程序的數據庫對象,以便db.transaction要求對數據庫DB執行事務。

如果我們這樣寫下一個下一節,您可以看到它的函數調用tx.executeSql,並且因爲它在執行db.transaction方法時會通過db句柄。

function(tx) { 
    tx.executeSql(sqlTxt,[val1,val2,val3]) 
} 

現在如果我們解析SQLTXT它可能看起來像這樣

INSERT INTO demo (geo1, geo2, geo3) VALUES ('a', 'b', 'c'); 

因爲我們傳遞三個變量來代替的?持有人,它看起來像上面的行。最後你調用錯誤和成功回調函數。

在你的情況我會創造一個queryDB功能是這樣的:

function queryDB(id) { 
    var sqlTxt = "SELECT * FROM DEMO WHERE id=?" 
    db.transaction(function(tx) {tx.executeSql(sqlTxt,[id])}, errorCB, successCB); 
} 

從本質上講,功能抓起參數ID,它傳遞到查詢的[ID]和執行,並返回錯誤或成功。顯然你可以擴展這個以使用多個參數,或者如果你想要非常聰明,你只需創建一個單一的數據庫事務函數,並傳入sql和參數以用作對象或數組(本例中將在我的博客上)

0

這是一個工作的解決方案:

var sqltxt= 'INSERT INTO CONTACTS(id, data) VALUES (?, ?)'; 
    var db = window.openDatabase("Database", "1.0", "Demo", 200000); 
    db.transaction(function(tx){tx.executeSql('DROP TABLE IF EXISTS CONTACTS'); 
      tx.executeSql('CREATE TABLE IF NOT EXISTS CONTACTS(name unique, password)'); 

      tx.executeSql(sqltxt,[name, pass]); 

    }, errorCB, successCB); 
相關問題