tableColumns
null
für alle Spalten wie in SELECT * FROM ...
new String[] { "column1", "column2", ... }
Für bestimmte Spalten wie in SELECT column1, column2 FROM ...
- können Sie hier auch komplexe Ausdrücke einfügen:
new String[] { "(SELECT max(column1) FROM table1) AS max" }
Sie erhalten eine Spalte max
mit dem Maximalwert voncolumn1
whereClause
- der Teil, den Sie nach
WHERE
diesem Schlüsselwort setzen, z"column1 > 5"
- sollte
?
für Dinge enthalten, die dynamisch sind, zB "column1=?"
-> sehenwhereArgs
whereArgs
- geben Sie den Inhalt , die jeweils füllt
?
in whereClause
der Reihenfolge , wie sie erscheinen
die Anderen
- genau wie
whereClause
die Anweisung nach dem Schlüsselwort oder null
wenn Sie es nicht verwenden.
Beispiel
String[] tableColumns = new String[] {
"column1",
"(SELECT max(column1) FROM table2) AS max"
};
String whereClause = "column1 = ? OR column1 = ?";
String[] whereArgs = new String[] {
"value1",
"value2"
};
String orderBy = "column1";
Cursor c = sqLiteDatabase.query("table1", tableColumns, whereClause, whereArgs,
null, null, orderBy);
// since we have a named column we can do
int idx = c.getColumnIndex("max");
entspricht der folgenden Rohabfrage
String queryString =
"SELECT column1, (SELECT max(column1) FROM table1) AS max FROM table1 " +
"WHERE column1 = ? OR column1 = ? ORDER BY column1";
sqLiteDatabase.rawQuery(queryString, whereArgs);
Wenn Sie die Where / Bind-Arg-Version verwenden, erhalten Sie automatisch maskierte Werte und müssen sich keine Sorgen machen, wenn Eingabedaten enthalten '
.
Unsicher: String whereClause = "column1='" + value + "'";
Sicher:String whereClause = "column1=?";
Denn wenn der Wert eine enthält, '
bricht Ihre Anweisung entweder ab und Sie erhalten Ausnahmen oder führt unbeabsichtigte Aktionen aus. Beispielsweise value = "XYZ'; DROP TABLE table1;--"
kann Ihre Tabelle sogar gelöscht werden, da die Anweisung aus zwei Anweisungen und einem Kommentar besteht:
SELECT * FROM table1 where column1='XYZ'; DROP TABLE table1;--'
Die Verwendung der args-Version XYZ'; DROP TABLE table1;--
würde maskiert 'XYZ''; DROP TABLE table1;--'
und nur als Wert behandelt. Auch wenn das '
nicht dazu gedacht ist, schlechte Dinge zu tun, ist es immer noch üblich, dass Leute es in ihren Namen haben oder es in Texten, Dateinamen, Passwörtern usw. verwenden. Verwenden Sie also immer die args-Version. (Es ist in Ordnung, int
andere Primitive direkt whereClause
einzubauen)