Używam metody zapytania SQLiteDatabase. Jak używać metody zapytania?
Próbowałem tego:
Cursor cursor = sqLiteDatabase.query(
tableName, tableColumns, whereClause, whereArgs, groupBy, having, orderBy);
TableColumns - Parametr kolumny jest zbudowany w następujący sposób.
String[] columns = new String[]{KEY_ID, KEY_CONTENT};
Jeśli potrzebujemy pobrać wszystkie pola, w jaki sposób należy skonstruować parametr kolumny. Czy musimy uwzględnić wszystkie nazwy pól w tablicy ciągów?
Jak prawidłowo używać metody zapytania?
Odpowiedzi:
tableColumns
null
dla wszystkich kolumn jak wSELECT * FROM ...
new String[] { "column1", "column2", ... }
dla określonych kolumn, jak wSELECT 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 nazwiemax
zawierającą maksymalną wartośćcolumn1
whereClause
WHERE
bez tego słowa kluczowego, np"column1 > 5"
?
rzeczy, które są dynamiczne, np."column1=?"
-> zobaczwhereArgs
whereArgs
?
wwhereClause
w kolejności ich występowaniainni
whereClause
instrukcja po słowie kluczowym lubnull
jeśli jej nie używasz.Przykład
jest odpowiednikiem następującego nieprzetworzonego zapytania
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ładvalue = "XYZ'; DROP TABLE table1;--"
może nawet upuścić twoją tabelę, ponieważ instrukcja stanie się dwoma instrukcjami i komentarzem: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żnaint
bezpośrednio budować i inne prymitywywhereClause
)źródło
limit
parametr, np developer.android.com/reference/android/database/sqlite/... to wszystko to tylko prosty konkatenacji tekstowy w końcu, dzięki czemu można umieścić np"some_column LIMIT 10"
naorderBy
i nadal pracatable1 CROSS JOIN table2
Jako nazwę tabeli. Ale jest moment, w którym spojrzałbym na rawquery: stackoverflow.com/q/10598137/995891query
metody są tylko dodanie kilku słów kluczowych, jakSELECT
iFROM
na argumenty (patrz źródła) , a następnie zrobićrawQuery
z powstałego łańcucha zapytania. Jeśli zapytanie nie pasuje dobrze do dostępnych argumentówquery
, po prostu napisz ciąg zapytania samodzielnie.Jest to bardziej ogólna odpowiedź, która ma być szybkim źródłem informacji dla przyszłych widzów.
Przykład
Wyjaśnienie z dokumentacji
źródło
Klauzula Where i argumenty współpracują ze sobą, tworząc instrukcję WHERE zapytania SQL. Więc powiedz, że chcesz wyrazić
Wtedy twoje whereClause i whereArgs będą następujące
Jeśli chcesz zaznaczyć wszystkie kolumny tabeli, uważam, że łańcuch o wartości null przekazany do tableColumns wystarczy.
źródło
?
w'
The'
dodaje automatycznie w razie potrzebyjeśli twoje zapytanie SQL jest takie
Następnie dla metody query () możemy zrobić tak: -
źródło
TABLE_ROW_ID + "=" + rowID
Tu=
jestwhere
klauzula. Aby wybrać wszystkie wartości, musisz podać nazwy wszystkich kolumn:a tutaj jest dobry poradnik dotyczący bazy danych.
źródło