51 votes

Parcourir les lignes de la requête Sqlite

Je dispose d'une mise en page de tableau que je veux remplir avec le résultat d'une requête sur une base de données. J'utilise un "select all" et la requête retourne quatre lignes de données.

J'utilise ce code pour remplir les TextViews à l'intérieur des lignes du tableau.

Cursor c = null;
c = dh.getAlternative2();
startManagingCursor(c);
// les colonnes désirées à lier
String[] columns = new String[] {DataHelper.KEY_ALT};
// les vues définies dans le XML auxquelles les données seront liées
int[] to = new int[] { R.id.name_entry};

SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, 
         R.layout.list_example_entry, c, columns, to);
this.setListAdapter(mAdapter);

Je veux pouvoir séparer les quatre valeurs différentes de KEY_ALT et choisir où elles vont. Je veux qu'elles remplissent quatre TextViews différents au lieu d'un dans mon exemple ci-dessus.

Comment puis-je itérer à travers le curseur résultant?

111voto

happydude Points 1907

Les objets Cursor retournés par les requêtes de base de données sont positionnés avant le premier élément, donc l'itération peut être simplifiée à :

while (cursor.moveToNext()) {
    // Extraire les données.
}

Référence de SQLiteDatabase.

5 votes

+1 De plus, cursor.moveToPosition(-1) gérera les curseurs partagés.

0 votes

Exception soulevée si je veux itérer à travers les lignes et que les lignes contiennent des données de jointure

82voto

chirag shah Points 4188

Vous pouvez utiliser le code ci-dessous pour parcourir le curseur et les stocker dans un tableau de chaînes, puis vous pouvez les définir dans quatre textviews

String array[] = new String[cursor.getCount()];
i = 0;

cursor.moveToFirst();
while (!cursor.isAfterLast()) {
    array[i] = cursor.getString(0);
    i++;
    cursor.moveToNext();
}

0 votes

Cela a du sens, mais je ne comprends pas comment je devrais l'utiliser. Dois-je toujours utiliser le ListAdapter? Où spécifie-je les textviews où chaque valeur doit aller?

0 votes

J'ai réussi en sautant le ListAdapter et en utilisant un mTv4.setText(ids[3]); pour spécifier la valeur de chaque textview. Merci beaucoup!

0 votes

J'ai rencontré le même problème, j'ai fait comme vous l'avez fait mais j'ai oublié d'incrémenter i (i++) donc seule la première ligne est là !!!

29voto

Juozas Kontvainis Points 3294
pour (boolean hasItem = cursor.moveToFirst(); hasItem; hasItem = cursor.moveToNext()) {
    // utiliser le curseur pour travailler avec l'élément actuel
}

20voto

chiranjib Points 1986

L'itération peut être faite de la manière suivante :

Cursor cur = sampleDB.rawQuery("SELECT * FROM " + Constants.TABLE_NAME, null);
ArrayList temp = new ArrayList();
if (cur != null) {
    if (cur.moveToFirst()) {
        do {
            temp.add(cur.getString(cur.getColumnIndex("Title"))); // "Title" est le nom du champ(colonne) de la table
        } while (cur.moveToNext());
    }
}

0 votes

Je suis presque sûr que votre ligne if (cur = null) n'était pas ce que vous vouliez écrire... Je suppose que cela devrait être if (cur != null) à la place. De plus, vous instanciez (et donc écrasez) temp avant d'ajouter des choses.

0 votes

J'ai également corrigé l'autre partie du code. J'espère que cela ne vous dérange pas. ;)

0 votes

Ceci est vraiment le meilleur exemple selon moi.

4voto

passsy Points 933

Trouvé un moyen très simple d'itérer sur un curseur

for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()){

    // accéder au curseur
    DatabaseUtils.dumpCurrentRowToString(cursor);
    final long id = cursor.getLong(cursor.getColumnIndex(BaseColumns._ID));

}

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