javascript - 使用 JavaScript 进行 SQLite SELECT

标签 javascript arrays sqlite select for-loop

我在“选择”查询方面遇到问题。 就我而言,我有一个循环(for第一个)来扫描我的数组,对于当前值,我的查询必须给出结果。 代码如下:

for (var key in arrayPlace) {        
        place = arrayPlace[key].replace(/'/g, '"'); 
        place=$.trim(place);
        //Id place
        sqls.executeSql("SELECT * FROM luogo_accomodation WHERE nome_luogo LIKE '"+place+"'",[], function(tx,result){
            //alert(sqls);
            if(result.rows.length==0){
                alert("Error.");
            }else{
                //alert("Found!");
                var len = result.rows.length, i;
                for (i = 0; i < len; i++){
                    idLuogo=result.rows.item(i).id_luogo;
                }


            }
        }, null);  
        //alert(idLuogo);

  }

如果我在for(第一个)中打印变量“key”或“place”的值,我将得到数组扫描的当前值,但是如果我在查询结果中打印这个变量(“key”或“place”),我将只有数组的最后一个值。

因此,如果我在指令“excetueSql”之后打印变量“idLuogo”的值,注释“​​alert(idLuogo)”,我将得到我的最后结果在查询中执行的数组。

我无法理解循环和查询的执行顺序。

你能帮我吗?

谢谢。

最佳答案

这与异步执行有关。将代码简化为重要部分:

for(var key...) {
  // A
  ...
  executeSQL(...., function(..., result) {
    // B
    ...
  }, ...);
  // C
}

这说:

For each key, first do A. Then tell the database "do some SQL, and when it is done, let me know so I can do B". Then do C, and repeat.

所以,假设您有两个键,foobar。执行如下:

  • A 为 foo 执行
  • 数据库被告知为 foo 执行 SQL,并在完成后执行 B。
  • C 为 foo 执行
  • 循环重新启动
  • A 为 bar 执行
  • 数据库被告知对 bar 执行 SQL,并在完成后执行 B。
  • C 为 bar 执行
  • 循环结束
  • 线程控制返回到运行时,它现在可以自由地执行其他事情(即开始监听 SQL 执行 B 的请求)。如果SQL在此时间之前完成,则必须等待。
  • 一段时间后,foo SQL 完成,并为 foo 执行 B。
  • 又过了一段时间(甚至可能在 foo SQL 完成之前),barSQL 完成,并执行 B forbar` .

现在,在您的 B 中,您首先显示 idLuogo,然后将其设置为新值。这意味着当 B for foo 执行时,它不会打印任何内容(因为 idLuogo 尚未设置),但是当 B for bar 时执行时,它将打印在那里设置的最后一个值(这是来自 B 的 foo 值)。

如果您在 B 中打印 key,则 key 循环已经完成,因此您将获得循环执行时它所具有的最后一个值。

关于javascript - 使用 JavaScript 进行 SQLite SELECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24526145/

相关文章:

javascript - 当用户放大或缩小时防止背景图像缩放

javascript - 为什么 Angular ng-src 使我的图像加倍?

Javascript 删除 forEach 中的元素

python - sqlalchemy批量更新性能问题

javascript - 获取Javascript文件的域

javascript - 我如何在我的客户端 javascript 中需要一个 Node 模块?

c++ - 如何将二维数组作为参数传递?

c++存储超出数组范围的值

android - 如何在 android 中使用 ViewFlipper 显示来自 sqlite 的内容

java - 如何在android中从SQLite数据库获取名称