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 decolumn1
whereClause
- la partie que vous mettez après
WHERE
sans 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 whereClause
il apparaît
les autres
- tout 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");
é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 int
et d'autres primitives directement dans whereClause
cependant)