Aspek yang penting bukanlah tabel atau tabel tetapi kueri itu sendiri yang menentukan urutan kolom.
Misalnya jika kueri didasarkan pada SELECT * FROM your_table
(dan kolom dalam tabel didefinisikan sebagai id, nama lagu, tahun lagu, jalur lagu) maka kolom adalah kursor akan sesuai definisi.
Namun, jika Anda melakukan SELECT songname, songpath, songid, songyear FROM your_table;
Urutannya akan sesuai dengan PILIH pernyataan yaitu nama lagu (0), jalur lagu (1), lagu (2), tahun lagu (3).
Namun, itu adalah salah satu masalah dengan menggunakan offset yang Anda ikat ke urutan sesuai SELECT.
Sekarang jika Anda menggunakan getColumnIndex Cur Kursor metode maka yang mengembalikan offset kolom sesuai dengan namanya.
Jadi cursor.getString(cursor.getColumnIndex("songpath"));
akan mendapatkan kolom jalur lagu terlepas dari offset/posisinya di Kursor (JIKA KURSOR TERMASUK KOLOM ITU).
Mengingat pertanyaan Anda sebelumnya, pada dasarnya Anda memiliki SELECT songpath FROM your_table
, Dengan demikian hanya ada satu kolom di Kursor yang dihasilkan sehingga Anda hanya bisa menggunakan get :-
cursor.getString(0);
atau :-
cursor.getString(cursor.getColumnIndex("songpath"));
Yang terakhir adalah metode yang direkomendasikan (TAPI idealnya memiliki nama kolom yang didefinisikan sebagai konstanta)
Masalah bisa menjadi lebih rumit, misalnya pertimbangkan
SELECT songpath||songname AS myconfusingcolumn FROM yourtable;
Ini akan mengembalikan satu kolom bernama myconfusingcolumn yang terdiri dari jalur lagu yang digabungkan dengan nama lagu. Yaitu kata kunci AS diikuti dengan alias untuk kolom (tanpa AS nama kolom akan lebih membingungkan/sulit karena akan menjadi jalur lagu||nama lagu) (contoh ini relatif sederhana).
Hal lain yang harus diwaspadai adalah, ambigu kolom (nama kolom yang digandakan) misalnya, jika Anda memiliki dua tabel lagu dan artis dan lagu, kolom tambahan artist_id maka Anda memiliki :-
Lagu tabel dengan kolom id , nama lagu , tahun lagu , jalur lagu , artis_id
Seniman tabel dengan kolom id dan nama_artis
dan Anda kemudian menggunakan
SELECT * FROM song JOIN artist ON song.artist_id = artist.id;
- Perhatikan bahwa sebagai id kolom artis tabel, jika digunakan dalam pernyataan, itu harus diawali dengan nama tabel masing-masing jika tidak, kesalahan kolom AMBIGUOUS akan dimunculkan yaitu pengurai SQL tidak akan tahu id mana kolom yang Anda maksud.
Selanjutnya Anda akan berakhir dengan Kursor yang memiliki kolom :-
id , nama lagu, tahun lagu, jalur lagu, artis_id, id , nama_artis
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).
Untuk rekap/ringkasan :-
Kolom, urutan dan nama, di Kursor sepenuhnya bergantung pada kueri SELECT. Mereka akan memiliki offset dan nama sesuai kueri. Saat mengakses Kursor, nama tabel yang mendasarinya tidak dapat digunakan hanya nama kolom atau offset.
Lebih fleksibel untuk mengakses kolom dengan nama mereka daripada dengan offstes mereka . Itu memanfaatkan getColumnIndex Cur Kursor metode karena meniadakan kebutuhan untuk menghitung offset dan lebih khusus lagi hilang perhitungan ulang jika kueri diubah.
Menggunakan CONSTANTS untuk nama kolom kemungkinan akan mengurangi masalah seperti kesalahan pengetikan.
Tambahan
Menggunakan Toast.makeText(this, mListSongs+"", Toast.LENGTH_SHORT).show();
Akan mendapatkan hasil yang tidak biasa [{}] karena mListSongs adalah keseluruhan wadah untuk Lagu. Anda perlu mengulang setiap elemen dan kemudian mendapatkan properti/nilai untuk setiap anggota/variabel dari elemen (Objek lagu).