J'essaie d'obtenir la valeur d'une colonne à partir d'un curseur, cette colonne est générée au moment de l'exécution par des calculs à l'intérieur de la requête, j'obtiens une valeur nulle de cette colonne, je suis en mesure d'obtenir une valeur de toutes les autres colonnes qui existent dans la table SQLite .
J'exécute la même requête sur l'éditeur SQLite, il montre également la valeur de la colonne générée dans le jeu de résultats.
Pourquoi cette valeur nulle lorsque je la récupère du curseur?
Très simple, vous pouvez l'obtenir de l'une des manières suivantes
String id = cursor.getString( cursor.getColumnIndex("id") ); // id is column name in db
ou
String id = cursor.getString( cursor.getColumnIndex(0)); // id is first column in db
Les noms de colonne de curseur sont sensibles à la casse, assurez-vous de faire correspondre la casse spécifiée dans le nom d'alias de la base de données ou de la colonne
Si vous ne connaissez pas l'index de colonne dans la requête de sélection, suivez ceci,
Définissez une constante pour tous les champs de la table afin qu'il soit facile d'obtenir le nom du champ, vous n'avez pas besoin de vérifier son sort
créer la classe Database Costant avec le nom "DBConstant.Java" et définir les champs de table
public static final String ID = "id";
Ensuite, obtenez la valeur du curseur,
cursor.getString (cursor.getColumnIndex (DBConstant.ID));
cursor.getColumnIndex (nom du champ); il renvoie l'index de colonne de champ dans vous sélectionnez l'instruction cursor.getString (index de colonne). il renvoie la valeur qui se trouve sur cette colonne
Si vous connaissez l'index des colonnes dans votre requête de sélection,
cursor.getString (0);
Si vous voulez obtenir la valeur de la chaîne
String id = cursor.getString( cursor.getColumnIndex("name") ); // id is column name in db
or
String id = cursor.getString( cursor.getColumnIndex(0));
Si vous voulez obtenir une valeur entière
String id = cursor.getInt( cursor.getColumnIndex("id") ); // id is column name in db
or
String id = cursor.getInt( cursor.getColumnIndex(0));
Dans Android Studio 3.4.1 (j'utilise Kotlin mais cela ne fait aucune différence ici), j'ai découvert un comportement très étrange.
Par exemple:
Cursor c = db.rawQuery("Select IDH, ID, NOME, CONTEUDO from CalcHome
Inner Join Calcs using(id)", null)
Les noms de colonne ont été enregistrés de manière rigide, indépendamment de la casse des noms de champ dans Select. Le composant du tableau c.columnNames[0]
est Idh
pas IDH
Donc
int a = c.getInt(c.getColumnIndex("IDH")) // gives a runtime error.
Mais
int a = c.getInt(c.getColumnIndex("Idh")) // works!