tableColumns
-
null
pour toutes les colonnes comme dans SELECT * FROM ...
-
new String[] { "column1", "column2", ... }
pour les colonnes spécifiques comme en SELECT column1, column2 FROM ...
- vous pouvez aussi mettre des expressions complexes ici:
new String[] { "(SELECT max(column1) FROM table1) AS max" }
vous donnent une colonne nommée max
holding la valeur max de column1
whereClause
- la partie que vous mettez après
WHERE
sans que mot-clé, par exemple, "column1 > 5"
- devrait inclure l'
?
pour les choses qui sont dynamiques, par exemple, "column1=?"
-> voir whereArgs
whereArgs
- préciser le contenu qui remplit chaque
?
en whereClause
dans l'ordre où ils apparaissent
les autres
- tout comme
whereClause
de 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 à celui-ci raw requête
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 le Où/Bind-Args version, vous obtenez automatiquement les valeurs d'échappement et vous n'avez pas à vous inquiéter si d'entrée de données contient '
.
Dangereux: String whereClause = "column1='" + value + "'";
Coffre-fort: String whereClause = "column1=?";
parce que si la valeur contient un '
votre déclaration se brise et vous obtenez des exceptions ou ne involontaire de choses, par exemple value = "XYZ'; DROP TABLE table1;--"
pourrait même tomber votre table depuis la déclaration de devenir deux états et un commentaire:
SELECT * FROM table1 where column1='XYZ'; DROP TABLE table1;--'
en utilisant les arguments de la version XYZ'; DROP TABLE table1;--
serait échappé d' 'XYZ''; DROP TABLE table1;--'
, et ne serait traitée comme une valeur. Même si l' '
n'est pas prévu pour faire de mauvaises choses, il est encore assez fréquent que les gens ont dans leur nom ou de l'utiliser dans les textes, les noms de fichiers, mots de passe, etc. Il faut donc toujours utiliser les arguments de la version. (Il est bon de construire int
et d'autres primitives directement dans whereClause
tout de même)