重要な側面は、1つまたは複数のテーブルではなく、列の順序を決定するクエリ自体です。
たとえば、クエリがSELECT * FROM your_table
に基づいている場合 (そして、テーブルの列はid、songname、songyear、songpathとして定義されました)、列はカーソルが定義どおりになります。
ただし、SELECT songname, songpath, songid, songyear FROM your_table;
を実行した場合
順序はSELECTのとおりです。 ステートメント、つまり、songname(0)、songpath(1)、songid(2)、songyear(3)。
ただし、これは、SELECTに従って順序に関連付けられているオフセットを使用する場合の問題の1つです。
ここで、カーソルの getColumnIndexを使用した場合 次に、その名前に従って列オフセットを返すメソッド。
したがって、cursor.getString(cursor.getColumnIndex("songpath"));
カーソル内のオフセット/位置に関係なく、ソングパス列を取得します(カーソルにその列が含まれている場合)。
前の質問を思い出してください。基本的にSELECT songpath FROM your_table
、そのため、結果のカーソルには1つの列しかないため、getのいずれかしか使用できませんでした:-
cursor.getString(0);
または:-
cursor.getString(cursor.getColumnIndex("songpath"));
後者が推奨される方法です(ただし、理想的には列名を定数として定義します)
ただし、問題はさらに複雑になる可能性があります。たとえば、検討してください
SELECT songpath||songname AS myconfusingcolumn FROM yourtable;
これにより、songnameと連結されたsongpathで構成されるmyconfusingcolumnという名前の単一の列が返されます。つまり、ASキーワードの後に列のエイリアスが続きます(ASがないと、列名はsongpath || songnameになるため、さらに混乱/困難になります)(この例は比較的単純です)。
注意すべきもう1つのことは、あいまいです。 列(重複した列名)。たとえば、songとartistの2つのテーブルがあり、追加の列artist_idを歌った場合、次のようになります:-
歌 列がidのテーブル 、曲名 、ソングイヤー 、ソングパス 、 Artists_id
アーティスト 列がidのテーブル およびartist_name
その後、使用しました
SELECT * FROM song JOIN artist ON song.artist_id = artist.id;
- idとして注意してください アーティストのコラム テーブル。ステートメントで使用する場合は、それぞれのテーブル名をプレフィックスとして付ける必要があります。そうしないと、AMBIGUOUS列エラーが発生します。つまり、SQLパーサーはどの idを認識しません。 あなたが意味する列。
さらに、列を持つカーソルになります:-
id 、songname、songyear、songpath、artist_id、 id 、artist_name
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).
要約/要約するには:-
カーソルの列、順序、名前は、SELECTクエリに完全に依存しています。 クエリに従って、オフセットと名前が付けられます。カーソルにアクセスするとき、基になるテーブル名は列名またはオフセットだけでは使用できません。
属性ではなく名前で列にアクセスする方が柔軟性があります 。つまり、カーソルの getColumnIndexを利用します。 オフセットを計算する必要がなく、特にクエリが変更された場合に再計算が欠落しているため、この方法。
列名にCONSTANTSを使用すると、入力ミスなどの問題が減少する可能性があります。
追加
Toast.makeText(this, mListSongs+"", Toast.LENGTH_SHORT).show();
を使用する
mListSongsは曲のコンテナ全体であるため、異常な結果[{}]が発生します。各要素をループしてから、要素(Songオブジェクト)から各メンバー/変数のプロパティ/値を取得する必要があります。