2012-07-22 63 views
0

我遇到以下一段代碼的問題。Phonegap。將空值插入到數據庫表中。數據類型衝突?

我有一個表格,用戶可以從現有位置和遊戲的下拉列表中進行選擇,或者如果它不存在,他們可以選擇「添加新遊戲/位置」並輸入遊戲和/或位置的名稱在文本字段中。當他們這樣做時,我想將新遊戲和/或位置寫入數據庫,並獲取新創建的ID,以便我可以正確更新會話表(記錄遊戲會話的位置)。

新的位置和遊戲正在寫入正確,但是,當我添加一個新的位置和遊戲時,我會在遊戲和會話表的位置字段中以空值結束。

插入新遊戲和位置時註釋掉的警報正在返回正確的值。

function addSession(tx){ 
    var locationID = $('#location').val(); 
    var gameID = $('#game').val(); 
    if ($('#location').val() == '0'){ 
    tx.executeSql(
     'INSERT INTO locations (lTitle) VALUES (?)', 
     [$('#newLocation').val()], 
     function(tx, results){ 
     locationID = results.insertId; 
     }, 
     errorCB 
    ); 
    } 
    if ($('#game').val() == '0'){ 
    tx.executeSql(
     'INSERT INTO games (lTitle) VALUES (?)', 
     [$('#newGame').val()], 
     function(tx, results){ 
     gameID = results.insertId; 
     }, 
     errorCB 
    ); 
    } 
    var sSQL = 'INSERT INTO sessions (date, duration, location, game, notes) VALUES ' 
    + '("'+$('#date').val()+' '+$('#time').val()+':00.000"' 
    +',2.5,'+locationID+','+gameID+',"'+$('#notes').val()+'")'; 
    tx.executeSql(
    sSQL, 
    [], 
    function(tx,results){ 
     //todo after successful entry 
    }, 
    errorCB 
); 
} 

我最初以爲這可能是因爲插入到會話表中的插入到遊戲和位置表之前執行,但如果這是我會得到「0」的情況下進入遊戲,位置字段而不是空值。

當我使用遊戲或位置菜單中的現有項目添加新會話(ID將> 0)時,插入工作正常。

這是會話表的設置,因爲它可能與數據類型衝突有關。我曾嘗試parseInt函數對返回的ID,但具有相同的結果

tx.executeSql(
    'CREATE TABLE IF NOT EXISTS sessions ' + 
    '(id INTEGER PRIMARY KEY , ' + 
    'date TEXT, ' + 
    'duration REAL, ' + 
    'game INTEGER, ' + 
    'location INTEGER, ' + 
    'notes TEXT' + 
    ')' 
); 
+0

這個'tx'的事情,爲什麼它似乎是在客戶端上運行的SQL查詢是什麼? – 2012-07-22 03:52:10

+0

它是本地數據庫:http://docs.phonegap.com/en/1.2.0/phonegap_storage_storage.md.html – Fraser 2012-07-22 03:55:32

回答

0

原來,這是由於錯誤的順序的各種查詢的執行。

我設法通過分離功能,像這樣排序的:

//FUNCTION TO ADD NEW LOCATIONS 
function addLocation(tx){ 
    tx.executeSql(
     'INSERT INTO locations (lTitle) VALUES (?)', 
     [$('#newLocation').val()], 
     function(tx, results){ 
      locationID = results.insertId; 
     }, 
     errorCB 
    ); 
} 

//FUNCTION TO ADD NEW GAMES 
function addGame(tx){ 
    tx.executeSql(
     'INSERT INTO games (gTitle) VALUES (?)', 
     [$('#newGame').val()], 
     function(tx, results){ 
      gameID = results.insertId; 
     }, 
     errorCB 
    ); 
} 

//FUNCTION TO ADD NEW SESSION 
function addSessionGo(tx){ 
    var sSQL = 'INSERT INTO sessions (date, game, location, notes) VALUES ' + 
     '("'+$('#date').val()+' '+$('#time').val()+':00.000"' + 
     ','+gameID+','+locationID+',"'+$('#notes').val()+'")'; 
    //alert(sSQL); 

    tx.executeSql(
     sSQL, 
     [], 
     function(tx,results){ 
      //todo after successful entry 
      //alert('Added new session'); 
     }, 
     errorCB 
    ); 
} 


//FUNCTION TO START ADDING THE NEW SESSION 
function addSession(tx){ 
    locationID = $('#location').val(); 
    gameID = $('#game').val(); 

    if ($('#location').val() == '0'){ 
     db.transaction(addLocation, errorCB); 
    } 

    if ($('#game').val() == '0'){ 
     db.transaction(addGame, errorCB); 
    } 

    db.transaction(addSessionGo, errorCB); 
}