2009-07-10 6 views
2

j'ai créé la méthode suivante pour récupérer les paramètres stockés dans la base:Android: Récupération des données de la question de la base de données

public String getEntry(long rowIndex){ 
    String value = ""; 

    Cursor c = db.query(DATABASE_TABLE, new String[] {KEY_NAME, VALUE}, KEY_NAME + "=" + rowIndex, null, null, null, null); 
    int columnIndex = c.getColumnIndex(VALUE); 
    int rowsCount = c.getCount(); 
    if(rowsCount > 0){ 
     String value = c.getString(columnIndex); 
    } 

    return value; 
} 

Sur le débogage, je peux voir le curseur c contient deux colonnes et une ligne mais quand il vient à la ligne

String value = c.getString(columnIndex); 

il lance le CursorIndexOutOfBoundsException bien columnIndex = 1 qui doit pointer vers une entrée valide.

Est-ce que quelqu'un sait ce qui pourrait être mauvais ici?

Répondre

4

Je ne connais pas votre DB-Wrapper que vous utilisez, mais je veux faire deux suppositions, puisque je connais un peu Sqlite.

Il pourrait être:

  1. Dans mon emballage et dans le C-API, il est nécessaire de faire une étape (ou suivant) chaque fois que vous souhaitez récupérer des données. Votre exception indique que vous n'êtes pas positionné sur la bonne ligne. Donc, vous pouvez essayer une "prochaine" ou "étape" (ce que votre DB-Wrapper comprend).

  2. Cette c.getCount() pourrait également apporter le problème. Que pourrait faire getCount pour compter sur un curseur? Il peut itérer le curseur jusqu'à ce qu'il soit terminé. Lorsque cela se produit, le curseur est épuisé et vous pouvez seulement refaire le tout. La lecture à ce stade va jeter quelque chose que vous avez. Pour éviter le problème sans avoir besoin de lire la table deux fois, vous devriez simplement lire tous les rangs vous-même et faire le compte vous-même. Il devrait y avoir des moyens dans votre DB-Wrapper (comme les exceptions levées ou les statuts), où vous pouvez vérifier si votre curseur est déjà épuisé.

Lorsque j'ai compris votre DB-Wrapper à droite, l'un d'eux pourrait être le problème.

+1

I a dû ajouter l'appel à moveNext(). Thaks beaucoup! –

2

Vous devez déplacer le curseur sur la première ligne avec c.moveToNext() avant de lire la valeur:

public String getEntry(long rowIndex) { 
    String value = ""; 

    Cursor c = db.query(DATABASE_TABLE, new String[] { KEY_NAME, VALUE }, 
      KEY_NAME + "=" + rowIndex, null, null, null, null); 

    int columnIndex = c.getColumnIndex(VALUE); 
    if (c.moveToNext()) { 
     value = c.getString(columnIndex); 
    } 

    return value; 
} 
2

J'ai une base de données créée précédemment .Qui a deux nom de champ, num.

Lorsque je veux récupérer des données de cette base de données à l'aide du curseur, une erreur se produit. mais je sais d suite via getCount() à partir du curseur retourné Voici mon code:

Cursor c=myDB.query(MY_DATABASE_TABLE,null,null,null,null,null,null); 
    Log.d("cursor",Integer.toString(c.getCount())); 

    if (c.moveToFirst()) 
{ 

do{ 
     String data = c.getString(c.getColumnIndex("name")); 

        Log.v("yo",data); 

       }while(c.moveToNext()); 

} 

erreur est mauvaise demande de tranche de trame 0, -1 numrows = 5, numColumns = 2

Questions connexes