SQLite
 sql >> Base de données >  >> RDS >> SQLite

si ma table a 4 colonnes et que je veux récupérer la 3ème colonne, que dois-je faire.

L'aspect important n'est pas la table ou les tables mais la requête elle-même car elle détermine l'ordre des colonnes.

Par exemple, si la requête était basée sur SELECT * FROM your_table (et les colonnes de la table ont été définies comme id, songname, songyear, songpath) alors la colonne est le curseur selon la définition.

Cependant, si vous avez fait SELECT songname, songpath, songid, songyear FROM your_table;

La commande serait selon le SELECT déclaration, c'est-à-dire nom de la chanson (0), chemin de la chanson (1), ID de la chanson (2), année de la chanson (3).

Cependant, c'est l'un des problèmes liés à l'utilisation des décalages que vous êtes lié à la commande selon le SELECT.

Maintenant, si vous avez utilisé le curseur getColumnIndex méthode qui renvoie alors le décalage de la colonne en fonction de son nom.

Donc cursor.getString(cursor.getColumnIndex("songpath")); obtiendrait la colonne songpath indépendamment de son décalage/position dans le curseur (SI LE CURSEUR INCLUT CETTE COLONNE).

Rappelant votre question précédente, vous aviez essentiellement SELECT songpath FROM your_table , En tant que tel, il n'y a qu'une seule colonne dans le curseur résultant, vous ne pouvez donc utiliser que l'un ou l'autre :-

cursor.getString(0); 

ou :-

cursor.getString(cursor.getColumnIndex("songpath"));

Cette dernière est la méthode recommandée (MAIS idéalement, les noms de colonne doivent être définis comme des constantes)

Les choses peuvent cependant devenir plus compliquées, par exemple, pensez à

SELECT songpath||songname AS myconfusingcolumn FROM yourtable;

Cela renverrait une seule colonne nommée myconfusingcolumn qui se compose du chemin de la chanson concaténé avec le nom de la chanson. C'est-à-dire que le mot-clé AS est suivi d'un alias pour la colonne (sans l'AS, le nom de la colonne serait encore plus déroutant/difficile car ce serait songpath||songname) (cet exemple est relativement simple).

Une autre chose dont il faut se méfier est, sont ambiguës colonnes (noms de colonne dupliqués) par exemple, si vous aviez deux tables chanson et artiste et chanson la colonne supplémentaire artist_id donc vous avez :-

La chanson table avec colonnes id , nom de la chanson , année de la chanson , chemin de la chanson , id_artiste

Les artistes table avec colonnes id et nom_artiste

et vous avez ensuite utilisé

SELECT * FROM song JOIN artist ON song.artist_id = artist.id;
  • Notez qu'en tant que id colonne de l'artiste table, si elle est utilisée dans l'instruction, elle doit être précédée du nom de la table respective, sinon une erreur de colonne AMBIGUOUS serait générée, c'est-à-dire que l'analyseur SQL ne saurait pas quel id colonne tu veux dire.

De plus, vous vous retrouveriez avec un curseur ayant des colonnes :-

identifiant , nom de la chanson, année de la chanson, chemin de la chanson, id_artiste, id , nom_artiste

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

Pour récapituler/résumer :-

Les colonnes, l'ordre et le nom d'un curseur dépendent entièrement de la requête SELECT. Ils auront un décalage et un nom selon la requête. Lors de l'accès au curseur, le ou les noms de table sous-jacents ne sont pas utilisables uniquement les noms de colonne ou les décalages.

Il est plus flexible d'accéder aux colonnes par leur nom plutôt que par leur origine . C'est-à-dire utiliser getColumnIndex du curseur car elle élimine le besoin de calculer les décalages et plus particulièrement le recalcul manquant en cas de modification d'une requête.

L'utilisation de CONSTANTES pour les noms de colonnes réduira probablement les problèmes tels que les erreurs de frappe.

Supplémentaire

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

Obtiendra le résultat inhabituel [{}] car mListSongs est le conteneur complet des morceaux. Vous devez parcourir chaque élément en boucle, puis obtenir les propriétés/valeurs de chaque membre/variable à partir de l'élément (objet Song).