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 max
zawierającą maksymalną wartośćcolumn1
whereClause
- część, którą wstawiłeś
WHERE
bez 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 whereClause
w kolejności ich występowania
inni
- podobnie jak
whereClause
instrukcja po słowie kluczowym lub null
jeś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 int
bezpośrednio budować i inne prymitywy whereClause
)