302 votes

Quelle est la meilleure façon d'itérer un curseur Android?

Je vois souvent des exemples de code où les gens itèrent sur le résultat d'une requête de base de données, font quelque chose avec chaque ligne, puis passent à la ligne suivante. Les exemples typiques sont les suivants.

 Cursor cursor = db.rawQuery(...);
cursor.moveToFirst();
while (cursor.isAfterLast() == false) 
{
    ...
    cursor.moveToNext();
}
 
 Cursor cursor = db.rawQuery(...);
for (boolean hasItem = cursor.moveToFirst(); 
     hasItem; 
     hasItem = cursor.moveToNext()) {
    ...
}
 
 Cursor cursor = db.rawQuery(...);
if (cursor.moveToFirst()) {
    do {
        ...                 
    } while (cursor.moveToNext());
}
 

Tout cela me semble excessivement long, chacun avec des appels multiples aux méthodes Cursor . Sûrement il doit y avoir un moyen plus propre?

527voto

Graham Borland Points 27556

La manière la plus simple est la suivante:

 while (cursor.moveToNext()) {
    ...
}
 

Le curseur commence avant la première ligne de résultat, donc à la première itération, il se déplace vers le premier résultat s'il existe . Si le curseur est vide ou si la dernière ligne a déjà été traitée, la boucle se ferme proprement.

121voto

Alex Styl Points 638

La meilleure façon que j'ai trouvée de passer par un curseur est la suivante:

 Cursor cursor;
... //fill the cursor here

for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
    // do what you need with the cursor here
}
 

Ne pas oublier de fermer le curseur après

EDIT: La solution donnée est géniale si vous avez besoin d'itérer un curseur dont vous n'êtes pas responsable. Un bon exemple serait, si vous prenez un curseur comme argument dans une méthode, et vous devez balayer le curseur pour une valeur donnée, sans avoir à vous soucier de la position actuelle du curseur.

49voto

Jörg Eisfeld Points 121

Je voudrais juste signaler une troisième alternative qui fonctionne aussi si le curseur n'est pas à la position de départ:

 if (cursor.moveToFirst()) {
    do {
        // do what you need with the cursor here
    } while (cursor.moveToNext());
}
 

4voto

Lars Points 310

La solution Do / While est plus élégante, mais si vous n'utilisez que la solution While affichée ci-dessus, sans moveToPosition (-1), vous manquerez le premier élément (au moins sur la requête Contact).

Je suggère:

 if (cursor.getCount() > 0) {
    cursor.moveToPosition(-1);
    while (cursor.moveToNext()) {
          <do stuff>
    }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X