2013-04-30 15 views
6

sto chiamando SQLite come questoSQLite in operatore in query()

String[] args = new String[]{"(A,B)"} 
Cursor cur = db.query("tab1", null, "name in ?", args, null, null, null); 

e la ricezione di eccezione:

android.database.sqlite.SQLiteException: near "?": syntax error: , while compiling: SELECT * FROM tab1 WHERE name in ? 

Come utilizzare in operatore in query()?

Ho già provato

String[] args = new String[]{"('A','B')"} 
+0

possibile duplicato di [clausola Android AND SQLite e segnaposti] (http://stackoverflow.com/questions/7418849/android-sqlite-in-clause-and-placeholders) –

risposta

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

Se non mi sbaglio, arg analisi non funziona con clausola IN. Quindi non puoi usare '?' nella tua clausola WHERE.

si dovrebbe fare qualcosa di simile:

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

e costruire i tuoi argomenti con un ciclo, se necessario.

+0

Questo è vulnerabile all'iniezione SQL. Consulta http://stackoverflow.com/questions/16295432/sqlite-in-operator-in-query#comment50252085_16349334 Se hai molti elementi, puoi costruire la selezione programmaticamente con i segnaposti al suo interno e passare i valori come parametro selectionArgs. Non si deve, in nessun caso, creare la query con i valori utilizzando la concatenazione di stringhe o la formattazione – bitek

4

Mentre si lavora su un progetto e alle prese con questa stessa domanda che ho trovato queste altre domande (e risposte) utile:

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

Ecco cosa Ho trovato dei lavori:

String[] args = new String[] {"A", "B"}; 
Cursor cur = db.query("tab1", null, "name in(?,?)", args, null, null, null); 

come sarà:

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



Quindi è possibile un uso multiplo ? con l'affermazione IN() e abbinare ciascuno con un elemento in selectionArgs array (come il primo esempio). Se si dispone di più condizioni nella vostra WHERE clausola, assicurarsi che corrisponda al ? con l'elemento corretto nel selectionArgs:

String[] args = new String[] {"Current", "A", "B"}; 
Cursor cur = db.query("tab1", null, "IsCurrent=? AND name in(?,?)", args, null, null, null); 


Oppure si può semplicemente utilizzare una stringa composta da argomenti virgole delineata direttamente nel IN() dichiarazione nella stringa selection stessa (come nel secondo esempio).



domande Il riferimento sembravano indicare che si potrebbe usare un singolo ? nel IN() e in qualche modo ampliare il parametro associato (s), ma non ero in grado di ottenere quello per funzionare.

+1

Non creare mai parti SQL da stringhe.È vulnerabile all'iniezione SQL. – PeterMmm

+0

@PeterMmm Sono ignorante sull'argomento di SQL injection (oltre alla regola di utilizzare sempre le chiamate SQL parametrizzate), quindi anche se tutti i dati provenivano dall'app, è ancora possibile avere un attacco di iniezione da una query? ... O è possibile che la stringa di query possa essere danneggiata se inviata a un db SQLite all'esterno dell'app? –

+0

Il punto è che tutte le richieste (dovrebbero) passare attraverso lo stesso metodo (query() in questo caso). Se query() è vulnerabile e corretto, non sarà più (o meno) vulnerabile. – PeterMmm