Metodo SQLiteDatabase.query


121

Sto usando il metodo di query di SQLiteDatabase. Come si utilizza il metodo di query?

Ho provato questo:

Cursor cursor = sqLiteDatabase.query(
    tableName, tableColumns, whereClause, whereArgs, groupBy, having, orderBy);

tableColumns : il parametro column è costruito come segue.

String[] columns = new String[]{KEY_ID, KEY_CONTENT};

Se abbiamo bisogno di ottenere tutti i campi, come dovrebbe essere costruito il parametro della colonna. Abbiamo bisogno di includere tutti i nomi di campo nell'array di stringhe?

Come si utilizza correttamente il metodo di query?


1
Prova un approccio semplice come questo
Imran Rana

Conosco quel metodo. Ma sto cercando di imparare come implementare il metodo di query invece di rawQuery.
sree_iphonedev

Risposte:


244

tableColumns

  • null per tutte le colonne come in SELECT * FROM ...
  • new String[] { "column1", "column2", ... }per colonne specifiche come in SELECT column1, column2 FROM ...- puoi anche inserire espressioni complesse qui:
    new String[] { "(SELECT max(column1) FROM table1) AS max" }ti darebbe una colonna denominata maxcontenente il valore massimo dicolumn1

dove la clausola

  • la parte che hai messo dopo WHEREsenza quella parola chiave, ad es"column1 > 5"
  • dovrebbe includere ?per le cose che sono dinamiche, ad esempio "column1=?"-> vediwhereArgs

whereArgs

  • specificare il contenuto che riempie ogni ?nel whereClausenell'ordine in cui appaiono

gli altri

  • proprio come whereClausel'affermazione dopo la parola chiave o nullse non la usi.

Esempio

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

è equivalente alla seguente query non elaborata

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

Usando la versione Where / Bind -Args ottieni automaticamente valori di escape e non devi preoccuparti se i dati di input contengono '.

Non String whereClause = "column1='" + value + "'";
sicuro: sicuro:String whereClause = "column1=?";

perché se il valore contiene una 'tua dichiarazione o si interrompe e ottieni eccezioni o fa cose non intenzionali, ad esempio value = "XYZ'; DROP TABLE table1;--"potresti persino eliminare la tua tabella poiché l'istruzione diventerebbe due dichiarazioni e un commento:

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

usando la versione args XYZ'; DROP TABLE table1;--verrebbe eseguito l'escape 'XYZ''; DROP TABLE table1;--'e verrebbe trattato solo come un valore. Anche se 'non è destinato a fare cose cattive, è ancora abbastanza comune che le persone lo abbiano nei loro nomi o lo usino in testi, nomi di file, password, ecc. Quindi usa sempre la versione args. (Va bene compilare inte altre primitive direttamente whereClauseperò)


Dove rientra il limite / offset in questo ... gruppo di? avendo? ordinato da?
Lion789

3
@ Lion789 Esistono diverse versioni che hanno un limitparametro, per esempio developer.android.com/reference/android/database/sqlite/... è tutto solo semplice concatenazione di testo, alla fine, in modo da poter mettere ad esempio "some_column LIMIT 10"in orderBye sarebbe ancora lavoro
zapl

Qualche opzione qui per unire 2 tavoli?
Vijay Kumbhoje

2
@VijayKumbhoje dovresti essere in grado di mettere ad esempio table1 CROSS JOIN table2come tablename. Ma c'è un punto in cui vorrei guardare rawquery: stackoverflow.com/q/10598137/995891
zapl

3
@VijayKumbhoje qualunque cosa ti senta più a tuo agio / sembra più pulita alla fine. I querymetodi aggiungono semplicemente alcune parole chiave come SELECTe FROMagli argomenti (vedi sorgente) quindi eseguono una rawQuerycon la stringa di query risultante. Se la tua query non si adatta bene agli argomenti disponibili di query, scrivi tu stesso la stringa della query.
zapl

21

Questa è una risposta più generale intesa come riferimento rapido per i futuri spettatori.

Esempio

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

Spiegazione dalla documentazione

  • table Stringa: il nome della tabella su cui compilare la query.
  • columns Stringa: un elenco di quali colonne restituire. Il passaggio di null restituirà tutte le colonne, il che è sconsigliato per impedire la lettura dei dati dall'archiviazione che non verranno utilizzati.
  • selection String: un filtro che dichiara quali righe restituire, formattato come una clausola WHERE SQL (escluso WHERE stesso). Il passaggio di null restituirà tutte le righe per la tabella data.
  • selectionArgs Stringa: è possibile includere nella selezione, che verranno sostituiti dai valori di selectionArgs, in modo che appaiano nella selezione. I valori verranno associati come stringhe.
  • groupBy String: un filtro che dichiara come raggruppare le righe, formattato come una clausola SQL GROUP BY (escluso lo stesso GROUP BY). Se si passa a null, le righe non verranno raggruppate.
  • having Stringa: un filtro dichiara quali gruppi di righe includere nel cursore, se si utilizza il raggruppamento di righe, formattato come una clausola SQL HAVING (escluso lo stesso HAVING). Il passaggio di null causerà l'inclusione di tutti i gruppi di righe ed è necessario quando il raggruppamento di righe non viene utilizzato.
  • orderBy String: come ordinare le righe, formattate come clausola SQL ORDER BY (escluso lo stesso ORDER BY). Il passaggio di null utilizzerà l'ordinamento predefinito, che potrebbe non essere ordinato.
  • limit Stringa: limita il numero di righe restituite dalla query, formattato come clausola LIMIT. Il passaggio di null non indica alcuna clausola LIMIT.

16

La clausola Where e gli argomenti lavorano insieme per formare l'istruzione WHERE della query SQL. Quindi dì che stai cercando di esprimere

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

Quindi il tuo whereClause e whereArgs sarà il seguente

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

Se vuoi selezionare tutte le colonne della tabella, credo che una stringa nulla passata a tableColumns sarà sufficiente.


non racchiudere ?in ', la 'si aggiunge automaticamente, se necessario
zapl

1

se la tua query SQL è così

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;

Quindi per il metodo query (), possiamo fare come: -

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

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 + "=" + rowID, ecco =la whereclausola. Per selezionare tutti i valori dovrai dare tutti i nomi delle colonne:

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

ed ecco un buon tutorial per il database.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.