Méthode SQLiteDatabase.query

121

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 - le paramètre de colonnes est construit comme suit.

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

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

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

sree_iphonedev
la source
1
Essayez une approche simple comme celle-ci
Imran Rana
Je connais cette méthode. Mais j'essaie d'apprendre comment implémenter la méthode de requête au lieu de rawQuery.
sree_iphonedev

Réponses:

244

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 maxcontenant la valeur maximale decolumn1

whereClause

  • la partie que vous mettez après WHEREsans ce mot-clé, par exemple"column1 > 5"
  • devrait inclure ?pour les choses qui sont dynamiques, par exemple "column1=?"-> voirwhereArgs

whereArgs

  • spécifier le contenu qui remplit chacun dans l'ordre ?dans lequel whereClauseil apparaît

les autres

  • tout comme whereClausel'instruction après le mot-clé ou nullsi 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");

équivaut à 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 des valeurs échappées et vous n'avez pas à vous inquiéter si les données d'entrée contiennent '.

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

parce que si value contient une 'instruction, votre instruction se brise et vous obtenez des exceptions ou fait des choses involontaires, par exemple, vous value = "XYZ'; DROP TABLE table1;--"pourriez même supprimer votre table puisque l'instruction deviendrait deux instructions et un commentaire:

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

l'utilisation de la version args XYZ'; DROP TABLE table1;--serait échappée vers 'XYZ''; DROP TABLE table1;--'et ne serait traitée que comme une valeur. Même si le 'n'est pas destiné à faire de mauvaises choses, il est encore assez courant que les gens l'aient dans leurs noms ou l'utilisent dans des textes, des noms de fichiers, des mots de passe, etc. Utilisez donc toujours la version args. (Il est normal de construire intet d'autres primitives directement dans whereClausecependant)

zapl
la source
Où se situe la limite / compensation dans ce ... groupe par? ayant? commandé par?
Lion789
3
@ Lion789 il existe plusieurs versions qui ont un limitparamètre, par exemple developer.android.com/reference/android/database/sqlite/ ... c'est juste une simple concaténation de texte à la fin afin que vous puissiez mettre par exemple "some_column LIMIT 10"dans orderByet cela fonctionnerait toujours
zapl
Une option ici pour rejoindre 2 tables?
Vijay Kumbhoje
2
@VijayKumbhoje vous devriez pouvoir mettre par exemple table1 CROSS JOIN table2comme nom de table. Mais il y a un moment où je regarderais rawquery: stackoverflow.com/q/10598137/995891
zapl
3
@VijayKumbhoje tout ce avec quoi vous vous sentez plus à l'aise / semble plus propre à la fin. Les queryméthodes ajoutent simplement quelques mots-clés comme SELECTet FROMaux arguments (voir source) puis font un rawQueryavec la chaîne de requête résultante. Si votre requête ne correspond pas bien aux arguments disponibles de query, écrivez simplement la chaîne de requête vous-même.
zapl
21

Il s'agit d'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 de la documentation

  • table Chaîne: nom de la table sur laquelle compiler la requête.
  • columns String: une liste des colonnes à renvoyer. La transmission de null renverra toutes les colonnes, ce qui est déconseillé pour empêcher la lecture de données du stockage qui ne seront pas utilisées.
  • selection Chaîne: un filtre déclarant les lignes à renvoyer, formaté comme une clause SQL WHERE (à l'exclusion du WHERE lui-même). Passer null renverra toutes les lignes de la table donnée.
  • selectionArgs Chaîne: Vous pouvez inclure des? S dans la sélection, qui seront remplacées par les valeurs de selectionArgs, afin qu'elles apparaissent dans la sélection. Les valeurs seront liées sous forme de chaînes.
  • groupBy Chaîne: un filtre déclarant comment grouper des lignes, formaté comme une clause SQL GROUP BY (à l'exclusion de GROUP BY lui-même). La transmission de null entraînera le non-regroupement des lignes.
  • having Chaîne: un filtre déclare les groupes de lignes à inclure dans le curseur, si le regroupement de lignes est utilisé, formaté comme une clause SQL HAVING (à l'exclusion du HAVING lui-même). La transmission de null entraînera l'inclusion de tous les groupes de lignes et est obligatoire lorsque le regroupement de lignes n'est pas utilisé.
  • orderBy Chaîne: comment ordonner les lignes, formatées comme une clause SQL ORDER BY (à l'exclusion de ORDER BY lui-même). Passer null utilisera l'ordre de tri par défaut, qui peut ne pas être ordonné.
  • limit Chaîne: limite le nombre de lignes renvoyées par la requête, au format clause LIMIT. Le fait de passer null n'indique aucune clause LIMIT.
Suragch
la source
16

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

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

Ensuite, votre whereClause et whereArgs seront les suivants

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

Si vous souhaitez sélectionner toutes les colonnes de table, je pense qu'une chaîne nulle transmise à tableColumns suffira.

Ancantus
la source
ne pas enfermer ?dans 'l' 'est ajouté automatiquement si nécessaire
zapl
1

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);
Puneet Verma
la source
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, voici =la whereclause. Pour sélectionner toutes les valeurs, vous devrez donner tous les noms de colonnes:

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.

Avi Kumar Manku
la source