tablaColumnas
null
para todas las columnas como en SELECT * FROM ...
new String[] { "column1", "column2", ... }
para columnas específicas como en SELECT column1, column2 FROM ...
- también puede poner expresiones complejas aquí:
new String[] { "(SELECT max(column1) FROM table1) AS max" }
le daría una columna llamada que max
contiene el valor máximo decolumn1
dónde cláusula
- la parte que pone después
WHERE
sin esa palabra clave, p. ej."column1 > 5"
- debe incluir
?
para cosas que son dinámicas, por ejemplo, "column1=?"
-> verwhereArgs
whereArgs
- especificar el contenido que llena cada uno
?
en whereClause
el orden en que aparecen
los demás
- al igual que
whereClause
la declaración después de la palabra clave o null
si no la usa.
Ejemplo
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");
es equivalente a la siguiente consulta sin procesar
String queryString =
"SELECT column1, (SELECT max(column1) FROM table1) AS max FROM table1 " +
"WHERE column1 = ? OR column1 = ? ORDER BY column1";
sqLiteDatabase.rawQuery(queryString, whereArgs);
Al usar la versión Where / Bind -Args, obtienes valores de escape automáticamente y no tienes que preocuparte si contienen datos de entrada '
.
Inseguro: String whereClause = "column1='" + value + "'";
Seguro:String whereClause = "column1=?";
porque si el valor contiene un '
enunciado, su declaración se rompe y obtiene excepciones o hace cosas no intencionadas, por ejemplo value = "XYZ'; DROP TABLE table1;--"
, incluso podría abandonar su tabla, ya que la declaración se convertiría en dos declaraciones y un comentario:
SELECT * FROM table1 where column1='XYZ'; DROP TABLE table1;--'
el uso de la versión args XYZ'; DROP TABLE table1;--
se escaparía 'XYZ''; DROP TABLE table1;--'
y solo se trataría como un valor. Incluso si '
no está destinado a hacer cosas malas, es bastante común que las personas lo tengan en sus nombres o lo usen en textos, nombres de archivos, contraseñas, etc. Así que siempre use la versión args. (Está bien construir int
y otras primitivas directamente en whereClause
aunque)