tableColumns
null
para todas las columnas como en SELECT * FROM ...
new String[] { "column1", "column2", ... }
para columnas específicas como en SELECT column1, column2 FROM ...
- expresiones complejas también se puede poner aquí:
new String[] { "(SELECT max(column1) FROM table1) AS max" }
le daría una columna denominada max
que contiene el valor máximo de column1
whereClause
- la parte que se pone después
WHERE
sin esa palabra clave , p.ej "column1 > 5"
- debe incluir
?
para elementos dinámicos, p. Ej."column1=?"
-> ver whereArgs
whereArgs
- especifique el contenido que llena cada
?
en whereClause
en 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 lo 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 prima
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 utilizar el Donde/BIND versión -Args se obtiene automáticamente los valores escaparon y Don no tiene que preocuparse si los datos de entrada contienen '
.
inseguro: String whereClause = "column1='" + value + "'";
seguro: String whereClause = "column1=?";
porque si el valor contiene un '
su estado de cuenta o bien se rompe y se obtiene excepciones o no no planeados cosas, por ejemplo value = "XYZ'; DROP TABLE table1;--"
incluso podría dejar su mesa desde la declaración se convertiría en dos estados y un comentario:
SELECT * FROM table1 where column1='XYZ'; DROP TABLE table1;--'
usando los argumentos versión XYZ'; DROP TABLE table1;--
se escapó a 'XYZ''; DROP TABLE table1;--'
y sólo sería tratado como un valor. Incluso si el '
no está destinado a hacer cosas malas, todavía es bastante común que la gente lo tenga en sus nombres o lo use 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
)
intentar un enfoque simple como [esto] (http://pastebin.com/3pfzXMgv) –
Conozco ese método. Pero estoy tratando de aprender cómo implementar el método de consulta en lugar de rawQuery. –