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).