web-dev-qa-db-fra.com

Méthode SQLiteDatabase.query

J'utilise la méthode de requête de SQLiteDatabase. Comment utiliser la méthode de requête? 

J'ai essayé ceci:

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

tableColumns - paramètre de colonnes est construit comme suit. 

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

Si nous devons obtenir tous les champs, comment le paramètre column doit-il être construit? Avons-nous besoin d'inclure tous les noms de champs dans le tableau String?

Comment utiliser correctement la méthode de requête?

116
sree_iphonedev

tableColonnes

  • null pour toutes les colonnes comme dans SELECT * FROM ...
  • new String[] { "column1", "column2", ... } pour des colonnes spécifiques comme dans SELECT column1, column2 FROM ... - vous pouvez également mettre des expressions complexes ici:
    new String[] { "(SELECT max(column1) FROM table1) AS max" } vous donnerait une colonne nommée max contenant la valeur maximale de column1

où Clause

  • la partie que vous mettez après WHERE sans ce mot clé, par exemple. "column1 > 5"
  • devrait inclure ? pour les éléments dynamiques, par exemple. "column1=?" -> voir whereArgs

oùArgs

  • spécifier le contenu qui remplit chaque ? dans whereClause dans l'ordre dans lequel ils apparaissent

les autres

  • comme whereClause l'instruction après le mot clé ou null si vous ne l'utilisez pas.

Exemple

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

est équivalent à la requête brute suivante

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

En utilisant la version Where/Bind -Args, vous obtenez automatiquement les valeurs échappées et vous n'avez pas à vous inquiéter si les données d'entrée contiennent '.

Peu sûr: String whereClause = "column1='" + value + "'";
Coffre: String whereClause = "column1=?";

parce que si value contient un ', votre instruction est cassée et vous obtenez des exceptions ou des actions inattendues. Par exemple, value = "XYZ'; DROP TABLE table1;--" peut même supprimer votre table car l'instruction deviendrait deux instructions et un commentaire:

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

utiliser la version de l'argument XYZ'; DROP TABLE table1;-- serait échappé à 'XYZ''; DROP TABLE table1;--' et ne serait traité que comme une valeur. Même si le ' n'est pas destiné à faire de mauvaises choses, il est assez courant que les gens le portent par leur nom ou l'utilisent dans des textes, des noms de fichiers, des mots de passe, etc. Utilisez donc toujours la version args. (Il est correct de construire int et d'autres primitives directement dans whereClause cependant)

231
zapl

La clause Where et les arguments fonctionnent ensemble pour former l'instruction WHERE de la requête SQL. Alors dites que vous cherchez à exprimer

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

Alors votre whereClause et whereArgs seront comme suit

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

Si vous voulez sélectionner toutes les colonnes de la table, je crois qu'une chaîne nulle passée à tableColonnes suffira.

16
Ancantus

Ceci est une réponse plus générale destinée à être une référence rapide pour les futurs téléspectateurs.

Exemple

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

Explication tirée de documentation

  • table String: Nom de la table sur laquelle compiler la requête.
  • columns String: liste des colonnes à renvoyer. Passer null renverra toutes les colonnes, ce qui est déconseillé pour empêcher la lecture de données de stockage qui ne va pas être utilisé.
  • selection String: Filtre déclarant les lignes à renvoyer, formaté sous la forme d'une clause SQL WHERE (à l'exclusion du WHERE lui-même). Qui passe NULL retournera toutes les lignes pour la table donnée.
  • selectionArgs String: Vous pouvez inclure? s dans la sélection, qui sera remplacée par les valeurs de selectionArgs, afin qu'elles apparaissent dans la sélection. Les valeurs seront liées en tant que chaînes.
  • groupBy String: Filtre indiquant comment grouper des lignes, formaté sous la forme d'une clause SQL GROUP BY (à l'exclusion de GROUP BY lui-même). Passant null fera que les lignes ne seront pas groupées.
  • having String: Un filtre déclare les groupes de lignes à inclure dans le curseur, si le groupe est utilisé, au format SQL HAVING clause (à l'exclusion du HAVING lui-même). Passer null entraînera toute la ligne groupes à inclure, et est obligatoire lorsque le regroupement de lignes n’est pas en cours utilisé.
  • orderBy String: comment ordonner les lignes sous la forme d'une clause SQL ORDER BY (à l'exclusion de ORDER BY). Passer null utilisera le ordre de tri par défaut, qui peut ne pas être ordonné.
  • limit String: limite le nombre de lignes renvoyées par la requête, formatées en tant que clause LIMIT. Passer null ne signifie pas de clause LIMIT.
15
Suragch

si votre requête SQL est comme ça

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;

Ensuite, pour la méthode query (), nous pouvons faire comme: -

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
Puneet Verma
 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, here "=" is the where clause

to select all values you will have to give all column names 

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

et voici un bon tutoriel pour la base de données 

http://www.anotherandroidblog.com/2010/08/04/Android-database-tutorial/

0
Avi Kumar Manku