基于以前的查询结果在Phonegap SQLite中查询

时间:2013-08-30 10:37:53

标签: android sqlite parameters cordova

我正在使用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)的东西来避免类似的问题。但我不知道如何在sqlite情况下这样做,我想传递正确的'item.title'和'results'参数。如果我使用

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

,另一个问题是结果将是“successCB(tx,results)”的输入参数,而不是“FROM T_SubTask”查询的结果对象。

我怎样才能在这里纠正一切?

1 个答案:

答案 0 :(得分:1)

通过在“FROM T_SubTask”查询中将参数名称更改为匿名成功函数,可以轻松修复results的问题。

对于item变量,您应该能够将if块中的代码移动到单独的函数中。类似的东西:

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变量将作为参数传递给函数。