tableColumns
null
per tutte le colonne come in SELECT * FROM ...
new String[] { "column1", "column2", ... }
per colonne specifiche come in SELECT column1, column2 FROM ...
- puoi anche inserire espressioni complesse qui:
new String[] { "(SELECT max(column1) FROM table1) AS max" }
ti darebbe una colonna denominata max
contenente il valore massimo dicolumn1
dove la clausola
- la parte che hai messo dopo
WHERE
senza quella parola chiave, ad es"column1 > 5"
- dovrebbe includere
?
per le cose che sono dinamiche, ad esempio "column1=?"
-> vediwhereArgs
whereArgs
- specificare il contenuto che riempie ogni
?
nel whereClause
nell'ordine in cui appaiono
gli altri
- proprio come
whereClause
l'affermazione dopo la parola chiave o null
se non la usi.
Esempio
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");
è equivalente alla seguente query non elaborata
String queryString =
"SELECT column1, (SELECT max(column1) FROM table1) AS max FROM table1 " +
"WHERE column1 = ? OR column1 = ? ORDER BY column1";
sqLiteDatabase.rawQuery(queryString, whereArgs);
Usando la versione Where / Bind -Args ottieni automaticamente valori di escape e non devi preoccuparti se i dati di input contengono '
.
Non String whereClause = "column1='" + value + "'";
sicuro: sicuro:String whereClause = "column1=?";
perché se il valore contiene una '
tua dichiarazione o si interrompe e ottieni eccezioni o fa cose non intenzionali, ad esempio value = "XYZ'; DROP TABLE table1;--"
potresti persino eliminare la tua tabella poiché l'istruzione diventerebbe due dichiarazioni e un commento:
SELECT * FROM table1 where column1='XYZ'; DROP TABLE table1;--'
usando la versione args XYZ'; DROP TABLE table1;--
verrebbe eseguito l'escape 'XYZ''; DROP TABLE table1;--'
e verrebbe trattato solo come un valore. Anche se '
non è destinato a fare cose cattive, è ancora abbastanza comune che le persone lo abbiano nei loro nomi o lo usino in testi, nomi di file, password, ecc. Quindi usa sempre la versione args. (Va bene compilare int
e altre primitive direttamente whereClause
però)