在sqlite中循环选择查询的问题?

时间:2014-04-21 14:36:00

标签: javascript arrays sqlite cordova asynchronous

我正在尝试迭代动态数组作为select查询的输入。不会为所有数组元素触发select查询。我在for循环中编写了select查询,问题是循环首先触发,而select查询仅针对数组的最后一个元素执行。可能是由于异步功能。我该如何解决这个问题,我的代码如下,

function sendCategoryDetailsNew(myLocation)
{
     var myLocationcoordinates = new Array();
     var db = window.sqlitePlugin.openDatabase({name: "MYDB"});
    for (var i = 0; i < myLocation.length; i++)
    {
    var locationName = myLocation[i];
    alert(locationName);
    db.transaction(function (tx) {
   tx.executeSql("select Coordinates from Locationlog WHERE Location = '"+locationName+"';", [], function (tx, res)
  {
   for (var i = 0; i < res.rows.length; i++)
   {
      alert("Location : "+locationName+ " Latlongs :"+ res.rows.item(i).Coordinates);
      myLocationcoordinates[i] = res.rows.item(i).Coordinates;
    }
  });
 });
 }
}

任何建议,

1 个答案:

答案 0 :(得分:0)

尝试简化代码。我认为问题是for内部for具有相同的迭代器名称。

以下是我将尝试此操作的示例:

function sendCategoryDetailsNew(myLocation)
{
    var myLocationcoordinates = new Array();
    var db = window.sqlitePlugin.openDatabase({name: "MYDB"});
    var locationsList = "\'" + myLocation.join("\',\'") + "\'";
    db.transaction(function (tx) {
        tx.executeSql("SELECT Location, Coordinates FROM Locationlog WHERE Location IN (?)", locationsList, function(tx, res) {
            for (var i = 0; i < res.rows.length; i++)
            {
                console.log("Location : " + res.rows.item(i).Location + " Latlongs : " + res.rows.item(i).Coordinates);
                myLocationcoordinates[i] = res.rows.item(i).Coordinates;
            }
        });
    }
}

我没有循环遍历两组值,而是将myLocation数组编译成一个可以在IN sql语句中使用的字符串。这将返回myLocation数组的所有结果,然后迭代它们进行处理。

这减少了大量处理,并且还在函数中创建了更少的失败点。