2010-11-29 17 views
1

Je suis un novice Android et j'ai expérimenté avec SQLite et Android. Je peux obtenir des requêtes et utiliser les résultats du curseur, mais je n'arrive pas à obtenir le code suivant pour fonctionner:Aidez s'il vous plaît! Erreur lors de l'accès aux données dans un curseur renvoyé par SQLite pour Android

Ceci est mon requête, où queryWhere = "MyObject =" 1 "" et DATABASE_TABLE_TOQUERY = "FavoriteObjects". Tout cela est correct lorsqu'il est affiché dans une visionneuse de base de données SQLite et il renvoie également un résultat correct si j'exécute la requête en utilisant ma visionneuse de base de données SQLite.

public long findObject(String[] keys, String[] values,String DATABASE_TABLE_TOQUERY){ 
    try { 
     if(keys.length<0 || keys.length!=values.length) 
      System.exit(-1); 
     String queryWhere = keys[0]+"=\""+values[0]+"\""; 
     for(int i=1;i<keys.length;i++) { 
      queryWhere+=" AND "+keys[i]+"=\""+values[i]+"\""; 
     } 
     Cursor mCursor = mDb.query(true, DATABASE_TABLE_TOQUERY, null, 
        queryWhere, null, null, null, null, null); 
     if (mCursor != null && mCursor.getCount()>0) 
      return Long.parseLong(mCursor.getString(mCursor.getColumnIndex(KEY_ROWID))); 

    }catch (SQLException e) { 
     return -1; 
    } 
    return -1; 
} 

Quand je reçois les résultats après l'exécution de l'instruction de la requête, le curseur mCursor a au moins une ligne, mais quand j'accéder à cette ligne à l'aide mCursor.getString (X), il renvoie une erreur bizarre:

android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1 

Si je vérifie mCursor.getColumnIndex (KEY_ROWID), j'obtiens une valeur 0 (ce qui est correct). Quelqu'un a des suggestions?

Merci! Jon

Répondre

2

Essayez

mCursor.moveToNext(); 
+0

MERCI DE VOTRE CONFIANCE! Pourriez-vous me dire pourquoi cela s'est passé comme ça? getCount() était seulement 1 pour le curseur ... – Jon

+0

Vous devez moveToNext() pour chaque ligne. "Déplace le curseur sur la première ligne Cette méthode retournera false si le curseur est vide." Vous pouvez faire une boucle sur toutes les lignes while (c.moveToNext()) {.. utiliser les données de ligne ..} – Mikpa

+0

Appelez moveToFirst() en premier, puis moveToNext(). –