2012-07-22 69 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); 
}