Método SQLiteDatabase.query

121

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?

sree_iphonedev
fonte
1
Tente uma abordagem simples como esta
Imran Rana
Eu conheço esse método. Mas estou tentando aprender como implementar o método de consulta em vez do rawQuery.
Sree_iphonedev 15/05

Respostas:

244

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 maxsegurando o valor máximo decolumn1

whereClause

  • a parte que você colocar WHEREsem 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 whereClauseordem em que aparecem

os outros

  • assim como whereClausea declaração após a palavra-chave ou nullse 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 inte outras primitivas diretamente no whereClauseembora)

zapl
fonte
Onde o limite / deslocamento se enquadra neste ... grupo por? tendo? ordenar por?
Lion789
3
@ Lion789 existem várias versões que têm um limitparâ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"em orderBye ele iria trabalhar ainda
zapl
Alguma opção aqui para juntar 2 mesas?
Vijay Kumbhoje
2
@VijayKumbhoje você deve poder colocar, por exemplo table1 CROSS JOIN table2, o nome da tabela. Mas há um ponto em que eu olharia para o rawquery: stackoverflow.com/q/10598137/995891
zapl
3
@VijayKumbhoje com o que você se sentir mais confortável / parecer mais limpo no final. Os querymétodos estão apenas adicionando algumas palavras-chave como SELECTe FROMaos argumentos (consulte a fonte) e faça um rawQuerycom a string de consulta resultante. Se sua consulta não se encaixar bem nos argumentos disponíveis query, basta escrever a string de consulta.
zapl 6/09/17
21

Esta é uma resposta mais geral, destinada a ser uma referência rápida para futuros espectadores.

Exemplo

SQLiteDatabase db = helper.getReadableDatabase();

String table = "table2";
String[] columns = {"column1", "column3"};
String selection = "column3 =?";
String[] selectionArgs = {"apple"};
String groupBy = null;
String having = null;
String orderBy = "column3 DESC";
String limit = "10";

Cursor cursor = db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit);

Explicação da documentação

  • table String: o nome da tabela na qual compilar a consulta.
  • columns String: Uma lista de quais colunas retornar. Passar nulo retornará todas as colunas, o que é desencorajado para impedir a leitura de dados do armazenamento que não será usado.
  • selection String: Um filtro que declara quais linhas retornar, formatadas como uma cláusula SQL WHERE (excluindo o WHERE em si). Passar nulo retornará todas as linhas para a tabela especificada.
  • selectionArgs String: você pode incluir? S na seleção, que serão substituídos pelos valores de selectionArgs, para que eles apareçam na seleção. Os valores serão vinculados como Strings.
  • groupBy String: Um filtro que declara como agrupar linhas, formatadas como uma cláusula SQL GROUP BY (excluindo o próprio GROUP BY). Passar nulo fará com que as linhas não sejam agrupadas.
  • having String: Um filtro declara quais grupos de linhas incluir no cursor, se o agrupamento de linhas estiver sendo usado, formatado como uma cláusula SQL HAVING (excluindo o próprio HAVING). Passar nulo fará com que todos os grupos de linhas sejam incluídos e é necessário quando o agrupamento de linhas não está sendo usado.
  • orderBy String: como ordenar as linhas, formatadas como uma cláusula SQL ORDER BY (excluindo a própria ORDER BY). Passar nulo usará a ordem de classificação padrão, que pode ser desordenada.
  • limit String: limita o número de linhas retornadas pela consulta, formatadas como cláusula LIMIT. Passar nulo não indica cláusula LIMIT.
Suragch
fonte
16

Cláusula Where e args trabalham juntos para formar a instrução WHERE da consulta SQL. Então diga que você quer expressar

WHERE Column1 = 'value1' AND Column2 = 'value2'

Em seguida, sua whereClause e whereArgs serão as seguintes

String whereClause = "Column1 =? AND Column2 =?";
String[] whereArgs = new String[]{"value1", "value2"};

Se você deseja selecionar todas as colunas da tabela, acredito que uma seqüência nula passada para tableColumns será suficiente.

Ancantus
fonte
não coloque ?em ', a 'é adicionada automaticamente, se necessário
zapl
1

se sua consulta SQL é assim

SELECT col-1, col-2 FROM tableName WHERE col-1=apple,col-2=mango
GROUPBY col-3 HAVING Count(col-4) > 5  ORDERBY col-2 DESC LIMIT 15;

Então, para o método query (), podemos fazer o seguinte: -

String table = "tableName";
String[] columns = {"col-1", "col-2"};
String selection = "col-1 =? AND col-2=?";       
String[] selectionArgs = {"apple","mango"};
String groupBy =col-3;
String having =" COUNT(col-4) > 5";
String orderBy = "col-2 DESC";
String limit = "15";

query(tableName, columns, selection, selectionArgs, groupBy, having, orderBy, limit);
Puneet Verma
fonte
0
db.query(
        TABLE_NAME,
        new String[] { TABLE_ROW_ID, TABLE_ROW_ONE, TABLE_ROW_TWO },
        TABLE_ROW_ID + "=" + rowID,
        null, null, null, null, null
);

TABLE_ROW_ID + "=" + rowID, aqui =está a wherecláusula Para selecionar todos os valores, você precisará fornecer todos os nomes de coluna:

or you can use a raw query like this 
db.rawQuery("SELECT * FROM permissions_table WHERE name = 'Comics' ", null);

e aqui está um bom tutorial para banco de dados.

Avi Kumar Manku
fonte