tableColumns
null
para todas as colunas como em SELECT * FROM ...
new String[] { "column1", "column2", ... }
para colunas específicas como em SELECT column1, column2 FROM ...
- você também pode colocar expressões complexas aqui:
new String[] { "(SELECT max(column1) FROM table1) AS max" }
daria a você uma coluna chamada max
segurando o valor máximo decolumn1
whereClause
- a parte que você colocar
WHERE
sem essa palavra-chave, por exemplo"column1 > 5"
- deve incluir
?
itens dinâmicos, por exemplo "column1=?"
-> consultewhereArgs
whereArgs
- especifique o conteúdo que preenche cada um
?
na whereClause
ordem em que aparecem
os outros
- assim como
whereClause
a declaração após a palavra-chave ou null
se você não a usar.
Exemplo
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");
é equivalente à seguinte consulta bruta
String queryString =
"SELECT column1, (SELECT max(column1) FROM table1) AS max FROM table1 " +
"WHERE column1 = ? OR column1 = ? ORDER BY column1";
sqLiteDatabase.rawQuery(queryString, whereArgs);
Ao usar a versão Where / Bind -Args, você obtém valores escapados automaticamente e não precisa se preocupar se os dados de entrada contiverem '
.
Inseguro: String whereClause = "column1='" + value + "'";
Seguro:String whereClause = "column1=?";
porque, se o valor contiver uma '
declaração, sua quebra será interrompida e você obterá exceções ou fará ações não intencionais, por exemplo, value = "XYZ'; DROP TABLE table1;--"
pode até soltar sua tabela, pois a declaração se tornaria duas declarações e um comentário:
SELECT * FROM table1 where column1='XYZ'; DROP TABLE table1;--'
usar a versão args XYZ'; DROP TABLE table1;--
seria escapado para 'XYZ''; DROP TABLE table1;--'
e seria tratado apenas como um valor. Mesmo que o '
objetivo não seja fazer coisas ruins, ainda é bastante comum que as pessoas o tenham em seus nomes ou o usem em textos, nomes de arquivos, senhas etc. Portanto, sempre use a versão args. (Não há problema em construir int
e outras primitivas diretamente no whereClause
embora)