2013-04-30 28 views
6

Ich rufe SQLite wie dieseSQLite in Operator in query()

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

und Empfangen Ausnahme:

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

Wie in Operator in Abfrage() verwenden?

Ich habe bereits versucht

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

möglich Duplikat von [Android/SQLite IN-Klausel und Platzhalter] (http://stackoverflow.com/questions/7418849/android-sqlite-in-clause-and-placeholders) –

Antwort

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

Wenn ich mich nicht täusche, arg Parsing nicht mit IN-Klausel nicht funktioniert. Du kannst also nicht '?' in Ihrer WHERE-Klausel.

Sie sollten etwas tun:

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

und Ihre args mit einer Schleife konstruieren, wenn nötig.

+0

Dies ist anfällig für SQL-Injektion. Siehe http://stackoverflow.com/questions/16295432/sqlite-in-operator-in-query#comment50252085_16349334 Wenn Sie viele Elemente haben, können Sie die Auswahl programmatisch mit den darin enthaltenen Platzhaltern konstruieren und die Werte als selectionArgs übergeben. Sie sollten unter keinen Umständen die Abfrage mit den Werten mithilfe von String-Verkettung oder Formatierung erstellen. – bitek

4

Während an einem Projekt arbeiten und mit dieser sehr gleichen Frage zu kämpfen, fand ich diese Fragen (und Antworten) hilfreich:

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

Hier ist, was Ich habe gefunden:

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

Wie wird:

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



So können Sie entweder mehrere ? mit der IN() Anweisung und jeder in selectionArgs Array mit einem Element entsprechen (wie das erste Beispiel). Wenn Sie mehrere Bedingungen in Ihrer WHERE Klausel haben, stellen Sie sicher, dass in selectionArgs die ? mit dem richtigen Elemente entsprechen:

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


Oder Sie können eine Zeichenfolge nur direkt aus durch Komma abgegrenzte Argumente bedienen in den IN() Anweisung in der selection Zeichenfolge selbst (wie im zweiten Beispiel).



Die referenzierte Fragen schien darauf hinzudeuten, dass Sie eine einzelne ? im IN() verwenden könnte und irgendwie erweitern Sie die zugehörigen Parameter (s), aber ich war nicht in der Lage, dass die Arbeit.

+1

Konstruieren Sie niemals SQL-Parts aus Zeichenfolgen.Es ist anfällig für SQL-Injektion. – PeterMmm

+0

@PeterMmm Ich bin unwissend auf das Thema der SQL-Injektion (abgesehen von der Regel, immer mit parametrisierten SQL-Aufrufe), also auch wenn alle Daten aus der App stammen, ist es immer noch möglich, eine Injektion Angriff von einer Abfrage zu haben? ... Oder ist die Abfragezeichenfolge möglicherweise beschädigt, wenn sie an eine SQLite-Datenbank außerhalb der App gesendet wird? –

+0

Der Punkt ist, dass alle Anfragen (sollte) durch die gleiche Methode (query() in diesem Fall) gehen. Wenn query() angreifbar und behoben ist, ist es nicht mehr (oder weniger) anfällig. – PeterMmm