San*_*der 0 sql sqlite web-sql
在websql中,我们可以像这样请求某一行:
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);
});
Run Code Online (Sandbox Code Playgroud)
但是,我知道常规的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);
});
Run Code Online (Sandbox Code Playgroud)
但这没有给我们任何结果,结果总是空的.如果我将删除[arr]
入arr
,然后sql将获得可变数量的参数,所以我认为它应该是[arr]
.否则它将要求我们添加动态数量的问号(与数组中的id一样多).
那么有谁能看到我做错了什么?
显然,除了为数组中的每个项目手动添加问号之外,没有其他解决方案.
这实际上是在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...
});
Run Code Online (Sandbox Code Playgroud)
更多信息: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 ?,?,?,?,?
Run Code Online (Sandbox Code Playgroud)
然而,这使用了我们项目中的underscore.js库.