的SQLite在运营商查询()
我打电话的SQLite这样的SQLite在运营商查询()
String[] args = new String[]{"(A,B)"}
Cursor cur = db.query("tab1", null, "name in ?", args, null, null, null);
和接收例外:
android.database.sqlite.SQLiteException: near "?": syntax error: , while compiling: SELECT * FROM tab1 WHERE name in ?
如何使用in
运营商查询()?
我已经尝试过
String[] args = new String[]{"('A','B')"}
String[] args = new String[]{A,B} // if A, B are variables
String[] args = new String[]{"A","B"}
Cursor cur = db.query("tab1", null, "name in (?,?)", args, null, null, null);
如果我没有记错的话,ARG解析不与IN子句工作。所以你不能使用'?'在你的WHERE子句中。
你应该做这样的事情:
String args = "A, B";
Cursor cur = db.query("tab1", null, "name in (" + args + ")", null, null, null, null);
,如果需要使用循环构建你的ARGS。
这很容易被SQL注入。见http://*.com/questions/16295432/sqlite-in-operator-in-query#comment50252085_16349334如果你有很多元素,你可以在它的占位符编程构建的选择和传递价值观为selectionArgs两个参数。你不应该在任何情况下,建立与使用字符串连接或格式化 – bitek 2015-06-29 15:28:08
虽然工作的一个项目,并用这同一个问题挣扎,我发现这些问题(和答案)有所帮助:
这里是什么我发现作品:
String[] args = new String[] {"A", "B"};
Cursor cur = db.query("tab1", null, "name in(?,?)", args, null, null, null);
作为将:
String args = "A, B";
Cursor cur = db.query("tab1", null, "name in(" + args + ")", null, null, null, null);
所以可以组合使用多个?
与IN()
语句和与selectionArgs
阵列的元件(与第一实施例)相互匹配。如果你在你的WHERE
条款多个条件,请务必将?
与正确的元素匹配selectionArgs
:
String[] args = new String[] {"Current", "A", "B"};
Cursor cur = db.query("tab1", null, "IsCurrent=? AND name in(?,?)", args, null, null, null);
或者你可以只使用在IN()
组成的逗号划定参数直接串在selection
字符串本身(如第二个例子)语句。
引用的问题似乎表明,你可以在IN()
使用单个?
并以某种方式扩大相关参数(一个或多个),但我没能得到那个工作。
永远不要构建任何SQL部分从字符串值的查询。它很容易被sql注入。 – PeterMmm 2013-05-03 06:13:19
@PeterMmm我对sql注入的话题一无所知(除了总是使用参数化SQL调用的规则外),所以即使所有数据都来自应用程序内部,仍然有可能从查询中产生注入攻击? ...或者,如果发送到应用程序外的SQLite数据库,查询字符串可能会损坏? – 2013-05-03 16:26:05
重点是,所有请求(应该)通过相同的方法(在这种情况下,查询())。如果query()易受攻击并且被修复,它将不会再受到(或更小)的攻击。 – PeterMmm 2013-05-03 18:52:29
[Android/SQLite IN子句和占位符]的可能重复(http://*.com/questions/7418849/android-sqlite-in-clause-and-placeholders) – 2013-04-30 08:37:47