0

次のコードに問題があります。

ユーザーが既存の場所とゲームのドロップダウンから選択できるフォームがあります。存在しない場合は、[新しいゲーム/場所を追加]を選択して、ゲームの名前や場所をテキストフィールドに入力できます。 。彼らがこれを行うとき、私は新しいゲームや場所をデータベースに書き込み、新しく作成されたIDを取得して、セッションテーブル(ゲームセッションが記録されている場所)を正しく更新できるようにします。

新しい場所とゲームは正しく書き込まれていますが、新しい場所とゲームを追加すると、セッションテーブルのゲームフィールドと場所フィールドにnull値が表示されます。

新しいゲームと場所を挿入するときのコメントアウトされたアラートは、正しい値を返しています。

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

最初は、セッションテーブルへの挿入がゲームテーブルとロケーションテーブルへの挿入の前に実行されていたためかもしれないと思っていましたが、この場合、ゲームフィールドとロケーションフィールドにnullではなく「0」が入力されます。

ゲームメニューまたはロケーションメニューの既存のアイテムを使用して新しいセッションを追加すると(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' +
  ')'
);
4

1 に答える 1

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);
}
于 2012-07-22T09:32:17.277 に答える