tableColumns
null dla wszystkich kolumn jak w SELECT * FROM ...
new String[] { "column1", "column2", ... }dla określonych kolumn, jak w SELECT column1, column2 FROM ...- możesz tu również umieścić złożone wyrażenia:
new String[] { "(SELECT max(column1) FROM table1) AS max" }dałoby ci kolumnę o nazwie maxzawierającą maksymalną wartośćcolumn1
whereClause
- część, którą wstawiłeś
WHEREbez tego słowa kluczowego, np"column1 > 5"
- powinien uwzględniać
?rzeczy, które są dynamiczne, np. "column1=?"-> zobaczwhereArgs
whereArgs
- określić treść, która wypełnia każdy
?w whereClausew kolejności ich występowania
inni
- podobnie jak
whereClauseinstrukcja po słowie kluczowym lub nulljeśli jej nie używasz.
Przykład
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");
jest odpowiednikiem następującego nieprzetworzonego zapytania
String queryString =
"SELECT column1, (SELECT max(column1) FROM table1) AS max FROM table1 " +
"WHERE column1 = ? OR column1 = ? ORDER BY column1";
sqLiteDatabase.rawQuery(queryString, whereArgs);
Używając wersji Where / Bind -Args, otrzymujesz automatycznie wartości ucieczki i nie musisz się martwić, jeśli dane wejściowe zawierają '.
Niebezpieczny: String whereClause = "column1='" + value + "'";
bezpieczny:String whereClause = "column1=?";
ponieważ jeśli wartość zawiera 'twoje wyrażenie, albo zepsuje się i otrzymasz wyjątki, albo zrobisz niezamierzone rzeczy, na przykład value = "XYZ'; DROP TABLE table1;--"może nawet upuścić twoją tabelę, ponieważ instrukcja stanie się dwoma instrukcjami i komentarzem:
SELECT * FROM table1 where column1='XYZ'; DROP TABLE table1;--'
użycie wersji args XYZ'; DROP TABLE table1;--zostałoby zmienione 'XYZ''; DROP TABLE table1;--'i traktowane jako wartość. Nawet jeśli 'nie jest przeznaczony do robienia złych rzeczy, nadal jest dość powszechne, że ludzie mają go w swoich nazwach lub używają go w tekstach, nazwach plików, hasłach itp. Dlatego zawsze używaj wersji args. (Można intbezpośrednio budować i inne prymitywy whereClause)