电话间隙.正在向数据库表中插入Null值.数据类型冲突

Phonegap. Null value being inserted into database table. Datatype conflict?

本文关键字:插入 Null 冲突 数据类型 数据库 间隙 电话间 电话      更新时间:2023-12-18

我对以下代码有问题。

我有一个表单,用户可以从现有位置和游戏的下拉列表中进行选择,如果不存在,他们可以选择"添加新游戏/位置",并在文本字段中输入游戏名称和/或位置。当他们这样做时,我想把新游戏和/或位置写入数据库,并获得新创建的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",而不是null。

当我使用游戏或位置菜单中的现有项目添加新会话时(ID将>0),插入操作正常。

以下是会话表的设置,以防它可能与数据类型冲突有关。我已经在返回的ID上尝试了parseInt,但结果与相同

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

事实证明,这是由于各种查询的执行顺序错误。

我设法通过如下方式分离函数来对其进行排序:

//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);
}