2013-04-30 3 views
6

Я звоню 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 clause and placeholders] (http://stackoverflow.com/questions/7418849/android-sqlite-in-clause-and-placeholders) –

ответ

3
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); 
0

Если я не ошибаюсь, Arg разборе не работает с пунктом IN. Таким образом, вы не можете использовать '?' в вашем предложении WHERE.

Вы должны сделать что-то вроде этого:

String args = "A, B"; 
Cursor cur = db.query("tab1", null, "name in (" + args + ")", null, null, null, null); 

и построить свою арг с петлей, если это необходимо.

+0

Это уязвимо для SQL-инъекции. См. Http://stackoverflow.com/questions/16295432/sqlite-in-operator-in-query#comment50252085_16349334 Если у вас много элементов, вы можете запрограммировать выбор с помощью заполнителей в нем и передать значения в качестве параметра selectionArgs. Вы ни в коем случае не должны строить запрос со значениями, используя конкатенацию или форматирование строк. – bitek

4

Во время работы над проектом и борется с этим тот же вопрос, который я нашел эти и другие вопросы (и ответы) полезные:

  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

+0

@PeterMmm Я не осведомлен о теме sql-инъекции (кроме правила, чтобы всегда использовать параметризованные SQL-вызовы), поэтому, даже если все данные были из приложения, все еще возможно иметь инъекционную атаку из запроса? ... Или может быть, что строка запроса может быть повреждена при отправке в SQLite db вне приложения? –

+0

Дело в том, что все запросы (должны) идут через один и тот же метод (запрос() в этом случае). Если query() уязвим и исправлен, он будет не более (или менее) уязвимым. – PeterMmm

Смежные вопросы