我在“选择”查询方面遇到问题。 就我而言,我有一个循环(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.
所以,假设您有两个键,foo
和 bar
。执行如下:
- 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 for
bar` .
现在,在您的 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/