Estou usando o método de consulta do SQLiteDatabase. Como uso o método de consulta?
Eu tentei isso:
Cursor cursor = sqLiteDatabase.query(
tableName, tableColumns, whereClause, whereArgs, groupBy, having, orderBy);
O parâmetro tableColumns - columns é construído da seguinte maneira.
String[] columns = new String[]{KEY_ID, KEY_CONTENT};
Se precisarmos obter todos os campos, como o parâmetro da coluna deve ser construído. Precisamos incluir todos os nomes de campo na matriz String?
Como uso corretamente o método de consulta?
Respostas:
tableColumns
null
para todas as colunas como emSELECT * FROM ...
new String[] { "column1", "column2", ... }
para colunas específicas como emSELECT 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 chamadamax
segurando o valor máximo decolumn1
whereClause
WHERE
sem essa palavra-chave, por exemplo"column1 > 5"
?
itens dinâmicos, por exemplo"column1=?"
-> consultewhereArgs
whereArgs
?
nawhereClause
ordem em que aparecemos outros
whereClause
a declaração após a palavra-chave ounull
se você não a usar.Exemplo
é equivalente à seguinte consulta bruta
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: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 construirint
e outras primitivas diretamente nowhereClause
embora)fonte
limit
parâmetro, por exemplo developer.android.com/reference/android/database/sqlite/... está tudo concatenação apenas texto simples, no final, de modo que você pode colocar por exemplo,"some_column LIMIT 10"
emorderBy
e ele iria trabalhar aindatable1 CROSS JOIN table2
, o nome da tabela. Mas há um ponto em que eu olharia para o rawquery: stackoverflow.com/q/10598137/995891query
métodos estão apenas adicionando algumas palavras-chave comoSELECT
eFROM
aos argumentos (consulte a fonte) e faça umrawQuery
com a string de consulta resultante. Se sua consulta não se encaixar bem nos argumentos disponíveisquery
, basta escrever a string de consulta.Esta é uma resposta mais geral, destinada a ser uma referência rápida para futuros espectadores.
Exemplo
Explicação da documentação
fonte
Cláusula Where e args trabalham juntos para formar a instrução WHERE da consulta SQL. Então diga que você quer expressar
Em seguida, sua whereClause e whereArgs serão as seguintes
Se você deseja selecionar todas as colunas da tabela, acredito que uma seqüência nula passada para tableColumns será suficiente.
fonte
?
em'
, a'
é adicionada automaticamente, se necessáriose sua consulta SQL é assim
Então, para o método query (), podemos fazer o seguinte: -
fonte
TABLE_ROW_ID + "=" + rowID
, aqui=
está awhere
cláusula Para selecionar todos os valores, você precisará fornecer todos os nomes de coluna:e aqui está um bom tutorial para banco de dados.
fonte