1

Phonegap とその sqlite API を使用して Android アプリを作成しています。前のクエリでいくつかの条件が満たされた場合に、レコードを挿入したいと思います。例えば、

tx.executeSql("SELECT * FROM T_Task WHERE is_valid=1",[], successCB, errorCB);

successCB で、タスクの日付が今日で、今日のサブタスクがまだ追加されていない場合、サブタスクを追加したい。タスクが既に存在するかどうかを確認する条件は、タスクのタイトルです。

function successCB(tx,results){
 for(var i=0; i<results.rows.length; i++){
   var item=results.rows.item(i);
   if(item.date==today){//'today' is defined elsewhere, globally accessible
      var sql="SELECT * FROM T_SubTask WHERE title='"+item.title+"' and date='"+today+"')";
      tx.executeSql(sql,[],function(tx,results){addSubTask(tx, results, item.title)},errorCB);
   }
}

問題は、複数のタスクがある場合、渡すパラメーター item.title が最後のループによってオーバーライドされることです。同様の問題を回避するために (function(x){FUNCTION(x)})(item.title) のようなものを使用できることを知っています。しかし、正しい 'item.title' と 'results' パラメーターの両方を渡したい sqlite のケースでそれを行う方法がわかりません。私が使用する場合

tx.executeSql(sql,[],function(tx,results){ (function(x){addSubTask(tx, results, x)})(item.title),errorCB);

、別の問題は、結果が「FROM T_SubTask」クエリの結果オブジェクトではなく、「successCB(tx, results)」の入力パラメーターになることです。

ここですべてを正しくするにはどうすればよいですか?

4

1 に答える 1

1

この問題resultsは、「FROM T_SubTask」クエリで引数の名前を匿名の成功関数に変更することで簡単に修正できます。

ifitem 変数に関しては、ブロック内のコードを別の関数に移動できるはずです。何かのようなもの:

function addSubtaskIfNeeded(item, tx) {
  var sql="SELECT * FROM T_SubTask WHERE title='"+item.title+"' and date='"+today+"')";
  tx.executeSql(sql,[],function(tx,subresults){addSubTask(tx, subresults, item.title)},errorCB);
}

results変数の名前も上記に変更されていることに注意してくださいsubresults。次に、if ブロック内のコードを変更して、その関数を呼び出します。

if (item.date == today) {
  addSubtaskIfNeeded(item, tx);
}

このようにして、クエリ コールバック関数item内の変数addSubtaskIfNeededは、関数に引数として渡される変数になります。

于 2013-08-30T13:17:15.993 に答える