2009-05-24 8 views
27

Je crée une application et j'ai des problèmes avec Cursor. J'ai un SQLiteDatabase qui me renvoie un Cursor lorsque je tente de récupérer les valeurs avec cette fonction:Obtenez la valeur du champ avec un curseur

public Cursor fetchOption(long rowId) throws SQLException { 

    Cursor mCursor = mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID, 
     KEY_TITLE, KEY_BODY}, KEY_ROWID + "=" + rowId, null, 
     null, null, null, null); 
    if (mCursor != null) { 
     mCursor.moveToFirst(); 
    } 
    return mCursor; 

} 

Je ne sais pas comment obtenir la valeur du champ dans la Cursor. Si je fais ça comme ceci:

String a = mOptionDb.fetchOption(0).getColumnName(0).toString(); 
String b = mOptionDb.fetchOption(0).getColumnName(1).toString(); 
String c = mOptionDb.fetchOption(0).getColumnName(2).toString(); 

Je ne pouvez utiliser que le nom des colonnes (_id, title, body), mais pas les valeurs. Des suggestions sur la façon d'y parvenir?

Répondre

80

Je pense que vous pouvez oublier de vérifier null.

chèque plutôt que s'il y a des données et accéder aux colonnes à l'aide du curseur:

Cursor cursor = fetchOption(0); 

if (cursor.moveToFirst()) // data? 
    System.out.println(cursor.getString(cursor.getColumnIndex("title")); 

cursor.close(); // that's important too, otherwise you're gonna leak cursors 

Il pourrait également judicieux de lire un tutoriel Android. Le didacticiel du bloc-notes semble correspondre à la facture: http://developer.android.com/guide/tutorials/notepad/index.html

+2

Merci pour votre aide. Maintenant ça marche. J'oublie tous les accès pour fermer le curseur ... –

+0

votre réponse m'aide aussi ... merci ... continuez à répondre .... +1 pour vous. – Siten

+1

chaque fois que j'ai ce problème, je reviens ici et réalise que j'ai oublié cursor.moveToFirst(). Merci! – user1549672

15

Vous pouvez utiliser les méthodes de get*Cursor pour récupérer les valeurs du résultat:

long id = cursor.getLong(cursor.getColumnIndex("_id")); 
long title = cursor.getString(cursor.getColumnIndex("title")); 
... 

Une meilleure pratique est évidemment d'utiliser des constantes (souvent fournies par ContentProviders) au lieu des appels à getColumnIndex avec chaînes codées en dur.

+0

avec la partie: int a = mOptionDb.fetchOption (0) .getColumnIndex ("titre"); J'obtiens "1". Mais avec mOptionDb.fetchOption (0) .getString (a); Je obtenir des erreurs: erreur/AndroidRuntime (628): gestionnaire Uncaught: thread principal sortie en raison d'une exception non interceptée ERREUR/AndroidRuntime (628): android.database.CursorIndexOutOfBoundsException: Index 0 a demandé, avec une taille de 0 Il est comme il ce n'est pas des données ?! –

6

Vous pouvez utiliser ce mécanisme.

Cursor record=db.test(finalDate);  
if(record.getCount()!=0){ 
    if(record.moveToFirst()){ 
     do{    
      Imgid1=record.getString(record.getColumnIndex(Database.PHOTO));     
     }while(record.moveToNext());       
    } 
    record.close();   
} 
Questions connexes