Der wichtige Aspekt ist nicht die Tabelle oder die Tabellen, sondern die Abfrage selbst, da diese die Spaltenreihenfolge bestimmt.
Zum Beispiel, wenn die Abfrage auf SELECT * FROM your_table
basiert (und die Spalten in der Tabelle wurden als id, songname, songyear, songpath definiert), dann wäre die Spalted der Cursor gemäß der Definition.
Wenn Sie jedoch SELECT songname, songpath, songid, songyear FROM your_table;
AUSWÄHLEN
Die Reihenfolge wäre wie bei SELECT Anweisung, z. B. Songname (0), Songpfad (1), Song-ID (2), Songjahr (3).
Dies ist jedoch eines der Probleme bei der Verwendung von Offsets, da Sie gemäß SELECT an die Reihenfolge gebunden sind.
Wenn Sie jetzt den getColumnIndex des Cursors verwendet haben Methode dann, die den Spalten-Offset gemäß ihrem Namen zurückgibt.
Also cursor.getString(cursor.getColumnIndex("songpath"));
würde die songpath-Spalte unabhängig von ihrem Offset/Position im Cursor erhalten (WENN DER CURSOR DIESE SPALTE ENTHÄLT).
Wenn Sie sich an Ihre vorherige Frage erinnern, hatten Sie im Grunde SELECT songpath FROM your_table
, daher gibt es nur eine einzige Spalte im resultierenden Cursor, sodass Sie nur get entweder :-
cursor.getString(0);
oder :-
cursor.getString(cursor.getColumnIndex("songpath"));
Letzteres ist die empfohlene Methode (ABER idealerweise sollten die Spaltennamen als Konstanten definiert sein)
Die Dinge können jedoch komplizierter werden, zum Beispiel betrachten
SELECT songpath||songname AS myconfusingcolumn FROM yourtable;
Dies würde eine einzelne Spalte namens myconfusingcolumn zurückgeben, die aus dem Songpfad besteht, der mit dem Songnamen verkettet ist. Das heißt, auf das AS-Schlüsselwort folgt ein Alias für die Spalte (ohne AS wäre der Spaltenname noch verwirrender/schwieriger als songpath||songname) (dieses Beispiel ist relativ einfach).
Eine andere Sache, auf die Sie achten sollten, ist, dass sie mehrdeutig sind Spalten (doppelte Spaltennamen) zum Beispiel, wenn Sie zwei Tabellen hatten, song und artist und song die zusätzliche Spalte artist_id, also haben Sie:-
Das Lied Tabelle mit Spalten id , Songname , Liederjahr , Liedpfad , Künstler_ID
Die Künstler Tabelle mit Spalten id und Künstlername
und Sie haben dann verwendet
SELECT * FROM song JOIN artist ON song.artist_id = artist.id;
- Beachten Sie das als id Spalte des Künstlers table, wenn sie in der Anweisung verwendet wird, muss ihr der entsprechende Tabellenname vorangestellt werden, sonst würde ein AMBIGUOUS-Spaltenfehler ausgegeben werden, d. h. der SQL-Parser würde nicht wissen, welche id Spalte meinst du.
Außerdem würden Sie am Ende einen Cursor mit Spalten haben:-
Kennung , Songname, Songjahr, Songpfad, artist_id, id , Künstlername
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).
Zur Wiederholung/Zusammenfassung:-
Die Spalten, Reihenfolge und Name in einem Cursor hängen vollständig von der SELECT-Abfrage ab. Sie haben einen Offset und einen Namen gemäß der Abfrage. Beim Zugriff auf den Cursor sind die zugrunde liegenden Tabellennamen nicht verwendbar, nur die Spaltennamen oder Offsets.
Es ist flexibler, auf Spalten über ihre Namen statt über ihre Offstes zuzugreifen . Verwenden Sie dazu den getColumnIndex des Cursors Methode, da sie die Notwendigkeit der Berechnung von Offsets und insbesondere der fehlenden Neuberechnung bei Änderung einer Abfrage vermeidet.
Die Verwendung von CONSTANTS für Spaltennamen führt wahrscheinlich zu weniger Problemen wie Tippfehlern.
Zusätzlich
Mit Toast.makeText(this, mListSongs+"", Toast.LENGTH_SHORT).show();
Erhält das ungewöhnliche Ergebnis [{}], da mListSongs der gesamte Container für die Songs ist. Sie müssen jedes Element durchlaufen und dann die Eigenschaften/Werte für jedes Mitglied/jede Variable aus dem Element (Song-Objekt) abrufen.