的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')"} 
+0

[Android/SQLite IN子句和占位符]的可能重复(http://*.com/questions/7418849/android-sqlite-in-clause-and-placeholders) – 2013-04-30 08:37:47

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。

+0

这很容易被SQL注入。见http://*.com/questions/16295432/sqlite-in-operator-in-query#comment50252085_16349334如果你有很多元素,你可以在它的占位符编程构建的选择和传递价值观为selectionArgs两个参数。你不应该在任何情况下,建立与使用字符串连接或格式化 – bitek 2015-06-29 15:28:08

虽然工作的一个项目,并用这同一个问题挣扎,我发现这些问题(和答案)有所帮助:

  1. Sqlite Query for multiple values in one columm
  2. Android/SQLite IN clause and placeholders

这里是什么我发现作品:

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()使用单个?并以某种方式扩大相关参数(一个或多个),但我没能得到那个工作。

+1

永远不要构建任何SQL部分从字符串值的查询。它很容易被sql注入。 – PeterMmm 2013-05-03 06:13:19

+0

@PeterMmm我对sql注入的话题一无所知(除了总是使用参数化SQL调用的规则外),所以即使所有数据都来自应用程序内部,仍然有可能从查询中产生注入攻击? ...或者,如果发送到应用程序外的SQLite数据库,查询字符串可能会损坏? – 2013-05-03 16:26:05

+0

重点是,所有请求(应该)通过相同的方法(在这种情况下,查询())。如果query()易受攻击并且被修复,它将不会再受到(或更小)的攻击。 – PeterMmm 2013-05-03 18:52:29