tx.executeSql('SELECT * FROM tblSettings where id = ?', [id], function(tx, rs){
// do stuff with the resultset.
},
function errorHandler(tx, e){
// do something upon error.
console.warn('SQL Error: ', e);
});
然而,我知道常规的SQL,并认为我应该能够请求
var arr = [1, 2, 3];
tx.executeSql('SELECT * FROM tblSettings where id in (?)', [arr], function(tx, rs){
// do stuff with the resultset.
},
function errorHandler(tx, e){
// do something upon error.
console.warn('SQL Error: ', e);
});
但是这没有给我们任何结果,结果总是空的。如果我将[arr]
删除到arr
,那么sql将获得可变数量的参数,所以我认为它应该是[arr]
。否则它会要求我们添加动态数量的问号(与数组中的id一样多)。
所以有人能看出我做错了吗?
答案 0 :(得分:6)
显然,除了为数组中的每个项目手动添加问号外,没有其他解决方案。
这实际上是在w3.org的规范中
var q = "";
for each (var i in labels)
q += (q == "" ? "" : ", ") + "?";
// later to be used as such:
t.executeSql('SELECT id FROM docs WHERE label IN (' + q + ')', labels, function (t, d) {
// do stuff with result...
});
此处有更多信息:http://www.w3.org/TR/webdatabase/#introduction(在介绍的最后)
然而,目前我创建了一个帮助函数,为我创建了这样一个字符串 可能比上面更好,可能没有,我还没有做过任何性能测试。
这就是我现在使用的
var createParamString = function(arr){
return _(arr).map(function(){ return "?"; }).join(',');
}
// when called like this:
createparamString([1,2,3,4,5]); // >> returns ?,?,?,?,?
然而,这可以使用我们项目中的underscore.js库。
答案 1 :(得分:0)
好的答案。阅读官方文档中的解释很有意思。
我看到这个问题在2012年得到了解答。我在谷歌37中尝试了它,正如它所推荐的那样,这就是我得到的。
输入数据:(我用黑色铅笔勾勒出来)
Chrome抱怨:
因此它接受尽可能多的问题符号,因为给出了许多输入参数。 (让我们注意虽然数组被传递,但它被视为一个参数)
最终我找到了这个解决方案:
var activeItemIds = [1,2,3];
var q = "";
for (var i=0; i< activeItemIds.length; i++) {
q += '"' + activeItemIds[i] + '", ';
}
q= q.substring(0, q.length - 2);
var query = 'SELECT "id" FROM "products" WHERE "id" IN (' + q + ')';
_db.transaction(function (tx) {
tx.executeSql(query, [], function (tx, results1) {
console.log(results1);
debugger;
}, function (a, b) {
console.warn(a);
console.warn(b);
})
})