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?
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
WHERE
sans ce mot clé, par exemple. "column1 > 5"
?
pour les éléments dynamiques, par exemple. "column1=?"
-> voir whereArgs
oùArgs
?
dans whereClause
dans l'ordre dans lequel ils apparaissentles autres
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)
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.
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.
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);
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/