SQLite
 sql >> Base de Dados >  >> RDS >> SQLite

se minha tabela tiver 4 colunas e eu quiser buscar a 3ª coluna o que eu faço.


O aspecto importante não é a tabela ou tabelas, mas a própria consulta, pois ela determina a ordem das colunas.

Por exemplo, se a consulta foi baseada em SELECT * FROM your_table (e as colunas na tabela foram definidas como id, songname, songyear, songpath) então o columnd é o cursor seria conforme a definição.

No entanto, se você fez SELECT songname, songpath, songid, songyear FROM your_table;

A ordem seria conforme SELECT ou seja, nome da música (0), caminho da música (1), songid (2), ano da música (3).

No entanto, esse é um dos problemas com o uso de deslocamentos que você está vinculado ao pedido de acordo com o SELECT.

Agora, se você usou o getColumnIndex do Cursor método então que retorna o deslocamento da coluna de acordo com seu nome.

Então cursor.getString(cursor.getColumnIndex("songpath")); obteria a coluna songpath independentemente de seu deslocamento/posição no cursor (SE O CURSOR INCLUI ESSA COLUNA).

Lembrando sua pergunta anterior, você basicamente tinha SELECT songpath FROM your_table , Como tal, há apenas uma única coluna no cursor resultante, então você só pode usar get:-
cursor.getString(0); 

ou :-
cursor.getString(cursor.getColumnIndex("songpath"));

O último é o método recomendado (MAS idealmente tem os nomes das colunas definidos como constantes)

As coisas podem ficar mais complicadas, por exemplo, considere
SELECT songpath||songname AS myconfusingcolumn FROM yourtable;

Isso retornaria uma única coluna chamada myconfusingcolumn que consiste no caminho da música concatenado com o nome da música. Ou seja, a palavra-chave AS é seguida por um alias para a coluna (sem o AS, o nome da coluna seria ainda mais confuso/difícil, pois seria songpath||songname) (este exemplo é relativamente simples).

Outra coisa a ser cautelosa é se são ambíguos colunas (nomes de coluna duplicados), por exemplo, se você tivesse duas tabelas song e artist e song a coluna adicional artist_id então você tem:-

A música tabela com colunas id , nome da música , ano da música , caminho da música , id_do_artista

Os artistas tabela com colunas id e nome_do_artista

e então você usou
SELECT * FROM song JOIN artist ON song.artist_id = artist.id;
  • Observe que, como o id coluna do artista table, se usado na instrução, ele deve ser prefixado com o respectivo nome da tabela, caso contrário, um erro de coluna AMBÍGUO seria gerado, ou seja, o analisador SQL não saberia qual id coluna que você quer dizer.

Além disso, você acabaria com um cursor com colunas:-

código , nome da música, ano da música, caminho da música, artist_id, id , nome do artista
csr.getLong(csr.getColumnIndex("id")); could get confused (I believe it actually gets the last AMBIGUOUS column)

long songid = csr.getLong(0); would get the id column from the song table.
long artistid = csr.getLong(5); would get the id column from the artist table.
long artistid = csr.getLong(4); would also get the artist_id same as (5).

Para recapitular/resumir:-

As colunas, ordem e nome, em um Cursor são totalmente dependentes da consulta SELECT. Eles terão um deslocamento e nome conforme a consulta. Ao acessar o Cursor, o(s) nome(s) de tabela subjacente(s) não pode(m) ser usado(s) apenas nos nomes das colunas ou deslocamentos.

É mais flexível acessar colunas por seus nomes do que por seus offstes . Isso é usar o getColumnIndex do cursor método, pois nega a necessidade de calcular deslocamentos e, mais especialmente, falta de recálculo, caso uma consulta seja alterada.

O uso de CONSTANTS para nomes de colunas provavelmente resultará em problemas reduzidos, como erros de digitação.

Adicional


Usando Toast.makeText(this, mListSongs+"", Toast.LENGTH_SHORT).show();

Obterá o resultado incomum [{}] porque mListSongs é o contêiner inteiro para as músicas. Você precisa percorrer cada elemento e, em seguida, obter as propriedades/valores para cada membro/variável do elemento (objeto Song).