SQLiteDatabase.query-Methode

121

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?

sree_iphonedev
quelle
1
Versuchen Sie einen einfachen Ansatz wie diesen
Imran Rana
Ich kenne diese Methode. Aber ich versuche zu lernen, wie man eine Abfragemethode anstelle von rawQuery implementiert.
sree_iphonedev

Antworten:

244

tableColumns

  • null für alle Spalten wie in SELECT * FROM ...
  • new String[] { "column1", "column2", ... }Für bestimmte Spalten wie in SELECT 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 Spalte maxmit dem Maximalwert voncolumn1

whereClause

  • der Teil, den Sie nach WHEREdiesem Schlüsselwort setzen, z"column1 > 5"
  • sollte ?für Dinge enthalten, die dynamisch sind, zB "column1=?"-> sehenwhereArgs

whereArgs

  • geben Sie den Inhalt , die jeweils füllt ?in whereClauseder Reihenfolge , wie sie erscheinen

die Anderen

  • genau wie whereClausedie Anweisung nach dem Schlüsselwort oder nullwenn Sie es nicht verwenden.

Beispiel

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");

entspricht der folgenden Rohabfrage

String queryString =
    "SELECT column1, (SELECT max(column1) FROM table1) AS max FROM table1 " +
    "WHERE column1 = ? OR column1 = ? ORDER BY column1";
sqLiteDatabase.rawQuery(queryString, whereArgs);

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. Beispielsweise value = "XYZ'; DROP TABLE table1;--"kann Ihre Tabelle sogar gelöscht werden, da die Anweisung aus zwei Anweisungen und einem Kommentar besteht:

SELECT * FROM table1 where column1='XYZ'; DROP TABLE table1;--'

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, intandere Primitive direkt whereClauseeinzubauen)

zapl
quelle
Wo fällt Limit / Offset in diese ... Gruppe von? haben? Sortieren nach?
Lion789
3
@ Lion789 Es gibt mehrere Versionen, die einen limitParameter haben, z. B. developer.android.com/reference/android/database/sqlite/…. Am Ende ist alles nur eine einfache "some_column LIMIT 10"orderBy
Textverkettung,
Gibt es hier eine Option, um 2 Tabellen zu verbinden?
Vijay Kumbhoje
2
@ VijayKumbhoje Sie sollten in der Lage sein, zB table1 CROSS JOIN table2als Tabellenname zu setzen. Aber es gibt einen Punkt, an dem ich mir rawquery ansehen würde: stackoverflow.com/q/10598137/995891
zapl
3
@ VijayKumbhoje was auch immer Sie sich wohler fühlen / sieht am Ende sauberer aus. Die queryMethoden fügen lediglich einige Schlüsselwörter wie SELECTund FROMzu den Argumenten hinzu (siehe Quelle) und führen dann eine rawQuerymit der resultierenden Abfragezeichenfolge durch. Wenn Ihre Abfrage nicht gut in die verfügbaren Argumente von passt query, schreiben Sie einfach die Abfragezeichenfolge selbst.
Zapl
21

Dies ist eine allgemeinere Antwort, die als Kurzreferenz für zukünftige Zuschauer dienen soll.

Beispiel

SQLiteDatabase db = helper.getReadableDatabase();

String table = "table2";
String[] columns = {"column1", "column3"};
String selection = "column3 =?";
String[] selectionArgs = {"apple"};
String groupBy = null;
String having = null;
String orderBy = "column3 DESC";
String limit = "10";

Cursor cursor = db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit);

Erklärung aus der Dokumentation

  • table Zeichenfolge: Der Tabellenname, anhand dessen die Abfrage kompiliert werden soll.
  • columns Zeichenfolge: Eine Liste der zurückzugebenden Spalten. Wenn Sie null übergeben, werden alle Spalten zurückgegeben. Dies wird nicht empfohlen, um zu verhindern, dass Daten aus dem Speicher gelesen werden, der nicht verwendet wird.
  • selection Zeichenfolge: Ein Filter, der angibt, welche Zeilen zurückgegeben werden sollen, formatiert als SQL WHERE-Klausel (ohne WHERE selbst). Wenn Sie null übergeben, werden alle Zeilen für die angegebene Tabelle zurückgegeben.
  • selectionArgs Zeichenfolge: Sie können? S in die Auswahl aufnehmen, die durch die Werte von selectionArgs ersetzt werden, damit sie in der Auswahl angezeigt werden. Die Werte werden als Strings gebunden.
  • groupBy Zeichenfolge: Ein Filter, der deklariert, wie Zeilen gruppiert werden sollen, formatiert als SQL GROUP BY-Klausel (mit Ausnahme der GROUP BY-Klausel selbst). Wenn Sie null übergeben, werden die Zeilen nicht gruppiert.
  • having Zeichenfolge: Ein Filter gibt an, welche Zeilengruppen in den Cursor aufgenommen werden sollen, wenn eine Zeilengruppierung verwendet wird, die als SQL-HAVING-Klausel formatiert ist (mit Ausnahme der HAVING-Klausel selbst). Wenn Sie null übergeben, werden alle Zeilengruppen eingeschlossen. Dies ist erforderlich, wenn die Zeilengruppierung nicht verwendet wird.
  • orderBy Zeichenfolge: So ordnen Sie die Zeilen an, die als SQL ORDER BY-Klausel formatiert sind (ausgenommen ORDER BY selbst). Wenn Sie null übergeben, wird die Standardsortierreihenfolge verwendet, die möglicherweise ungeordnet ist.
  • limit Zeichenfolge: Begrenzt die Anzahl der von der Abfrage zurückgegebenen Zeilen, die als LIMIT-Klausel formatiert sind. Das Übergeben von null bedeutet keine LIMIT-Klausel.
Suragch
quelle
16

Where-Klausel und Argumente bilden zusammen die WHERE-Anweisung der SQL-Abfrage. Sagen Sie also, Sie möchten sich ausdrücken

WHERE Column1 = 'value1' AND Column2 = 'value2'

Dann sind Ihre whereClause und whereArgs wie folgt

String whereClause = "Column1 =? AND Column2 =?";
String[] whereArgs = new String[]{"value1", "value2"};

Wenn Sie alle Tabellenspalten auswählen möchten, reicht meiner Meinung nach eine an tableColumns übergebene Nullzeichenfolge aus.

Ancantus
quelle
nicht umschließen ?in 'der 'wird automatisch hinzugefügt , wenn erforderlich
zapl
1

wenn Ihre SQL-Abfrage so ist

SELECT col-1, col-2 FROM tableName WHERE col-1=apple,col-2=mango
GROUPBY col-3 HAVING Count(col-4) > 5  ORDERBY col-2 DESC LIMIT 15;

Dann können wir für die query () -Methode Folgendes tun: -

String table = "tableName";
String[] columns = {"col-1", "col-2"};
String selection = "col-1 =? AND col-2=?";       
String[] selectionArgs = {"apple","mango"};
String groupBy =col-3;
String having =" COUNT(col-4) > 5";
String orderBy = "col-2 DESC";
String limit = "15";

query(tableName, columns, selection, selectionArgs, groupBy, having, orderBy, limit);
Puneet Verma
quelle
0
db.query(
        TABLE_NAME,
        new String[] { TABLE_ROW_ID, TABLE_ROW_ONE, TABLE_ROW_TWO },
        TABLE_ROW_ID + "=" + rowID,
        null, null, null, null, null
);

TABLE_ROW_ID + "=" + rowIDHier =ist die whereKlausel. Um alle Werte auszuwählen, müssen Sie alle Spaltennamen angeben:

or you can use a raw query like this 
db.rawQuery("SELECT * FROM permissions_table WHERE name = 'Comics' ", null);

und hier ist ein gutes Tutorial für die Datenbank.

Avi Kumar Manku
quelle