Ich verwende die Abfragemethode von SQLiteDatabase. Wie verwende ich die Abfragemethode?
Ich habe es versucht:
Cursor cursor = sqLiteDatabase.query(
tableName, tableColumns, whereClause, whereArgs, groupBy, having, orderBy);
Der Parameter tableColumns - column ist wie folgt aufgebaut.
String[] columns = new String[]{KEY_ID, KEY_CONTENT};
Wenn wir alle Felder abrufen müssen, wie soll der Spaltenparameter erstellt werden? Müssen wir alle Feldnamen in das String-Array aufnehmen?
Wie verwende ich die Abfragemethode richtig?
Antworten:
tableColumns
null
für alle Spalten wie inSELECT * FROM ...
new String[] { "column1", "column2", ... }
Für bestimmte Spalten wie inSELECT 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 Spaltemax
mit dem Maximalwert voncolumn1
whereClause
WHERE
diesem Schlüsselwort setzen, z"column1 > 5"
?
für Dinge enthalten, die dynamisch sind, zB"column1=?"
-> sehenwhereArgs
whereArgs
?
inwhereClause
der Reihenfolge , wie sie erscheinendie Anderen
whereClause
die Anweisung nach dem Schlüsselwort odernull
wenn Sie es nicht verwenden.Beispiel
entspricht der folgenden Rohabfrage
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. Beispielsweisevalue = "XYZ'; DROP TABLE table1;--"
kann Ihre Tabelle sogar gelöscht werden, da die Anweisung aus zwei Anweisungen und einem Kommentar besteht: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 direktwhereClause
einzubauen)quelle
limit
Parameter haben, z. B. developer.android.com/reference/android/database/sqlite/…. Am Ende ist alles nur eine einfache"some_column LIMIT 10"
orderBy
table1 CROSS JOIN table2
als Tabellenname zu setzen. Aber es gibt einen Punkt, an dem ich mir rawquery ansehen würde: stackoverflow.com/q/10598137/995891query
Methoden fügen lediglich einige Schlüsselwörter wieSELECT
undFROM
zu den Argumenten hinzu (siehe Quelle) und führen dann einerawQuery
mit der resultierenden Abfragezeichenfolge durch. Wenn Ihre Abfrage nicht gut in die verfügbaren Argumente von passtquery
, schreiben Sie einfach die Abfragezeichenfolge selbst.Dies ist eine allgemeinere Antwort, die als Kurzreferenz für zukünftige Zuschauer dienen soll.
Beispiel
Erklärung aus der Dokumentation
quelle
Where-Klausel und Argumente bilden zusammen die WHERE-Anweisung der SQL-Abfrage. Sagen Sie also, Sie möchten sich ausdrücken
Dann sind Ihre whereClause und whereArgs wie folgt
Wenn Sie alle Tabellenspalten auswählen möchten, reicht meiner Meinung nach eine an tableColumns übergebene Nullzeichenfolge aus.
quelle
?
in'
der'
wird automatisch hinzugefügt , wenn erforderlichwenn Ihre SQL-Abfrage so ist
Dann können wir für die query () -Methode Folgendes tun: -
quelle
TABLE_ROW_ID + "=" + rowID
Hier=
ist diewhere
Klausel. Um alle Werte auszuwählen, müssen Sie alle Spaltennamen angeben:und hier ist ein gutes Tutorial für die Datenbank.
quelle