web-dev-qa-db-fra.com

android cursor.moveToNext ()?

J'essaie d'interroger toutes les colonnes d'une table dans une vue de texte longue et/ou une chaîne. Je sais que ce n'est peut-être pas la bonne façon de faire les choses, mais je dois le faire. Corrigez-moi si je me trompe, j'avais l'impression que déplacer ensuite la colonne suivante de la rangée:

Cursor c = db.get();
if(c.moveToFirst){
do{
string = c.getString(0);
}while(c.moveToNext);

Je pensais que cela obtiendrait la première colonne et afficherait tout son contenu, à la place de la première colonne et de la première ligne. Qu'est-ce que je fais mal? Existe-t-il un moyen meilleur ou réel d'obtenir cette information sans utiliser ListView?

10
Christian

Pour plus de clarté, voici un exemple complet qui, je l’espère, présente un intérêt. Comme indiqué dans les commentaires de code, nous parcourons essentiellement les lignes de la base de données, puis les colonnes, pour former un tableau de données correspondant à la base de données.

    Cursor cursor = getActivity().getContentResolver().query(uri, projection, null, null,
            null);

    //if the cursor isnt null we will essentially iterate over rows and then columns
    //to form a table of data as per database.
    if (cursor != null) {

        //more to the first row
        cursor.moveToFirst();

        //iterate over rows
        for (int i = 0; i < cursor.getCount(); i++) {

            //iterate over the columns
            for(int j = 0; j < cursor.getColumnNames().length; j++){ 

                //append the column value to the string builder and delimit by a pipe symbol
                stringBuilder.append(cursor.getString(j) + "|"); 
            }
            //add a new line carriage return
            stringBuilder.append("\n");

            //move to the next row
            cursor.moveToNext();
        }
        //close the cursor
        cursor.close();
    }
13
user1720179

L'utilisation simple est:

Cursor cursor = db.query(...);
while (cursor.moveToNext()) {
    ...
}

moveToFirst est utilisé lorsque vous devez commencer à itérer une fois que vous avez atteint une position.

Évitez d’utiliser cursor.getCount () sauf si cela est requis. Et n'utilisez jamais de boucle sur getCount ().

getCount est cher - il faut parcourir plusieurs enregistrements pour les compter. Il ne retourne pas une variable stockée. Il peut y avoir une mise en cache sur un second appel, mais le premier appel ne connaît pas la réponse tant qu’elle n’a pas été comptée.

Si votre requête correspond à 1000 lignes, le curseur ne contient en réalité que la première ligne. Chaque moveToNext recherche et trouve la correspondance suivante. getCount doit trouver tous les 1000. Pourquoi parcourir l'ensemble si vous n'avez besoin que de 10? Pourquoi itérer deux fois?

De plus, si votre requête n'utilise pas d'index, getCount peut être encore plus lent. GetCount peut dépasser 10000 enregistrements même si la requête ne correspond qu'à 100. Pourquoi créer une boucle 20000 au lieu de 10000?

31
Pla

moveToNext déplace le curseur à la ligne suivante. et c.getString (0) vous donnera toujours la première colonne, le cas échéant. Je pense que vous devriez faire quelque chose de similaire à cela dans votre boucle

int index = c.getColumnIndex("Column_Name");
string = c.getString(index);
1
CChi

cursor.moveToFirst() déplace le curseur sur la première ligne. Si vous savez que vous avez 6 colonnes et que vous voulez une chaîne contenant toutes les colonnes, essayez ce qui suit.

c.moveToFirst();
StringBuilder stringBuilder = new StringBuilder();
for(int i = 0; i < 6; i++){
   stringBuilder.append(c.getString(i));
}

// to return the string, you would do stringBuilder.toString();
1
Raunak

Je code mes boucles sur le miroir comme ceci:

    cursor.moveToFirst();
    while(!cursor.isAfterLast()) {

            cursor.getString(cursor.getColumnIndex("column_name"));

        cursor.moveToNext();
    }

Ça marche toujours. Cela va récupérer les valeurs de la colonne "nom_colonne" de toutes les lignes. Votre erreur est que vous passez en boucle sur les lignes et non sur les colonnes. Pour boucler sur les colonnes:

cursor.moveToFirst();    
    for(int i = 0; i < cursor.getColumnNames().length; i++){
        cursor.getString(i);
    }

Cela fera une boucle sur les colonnes de la première ligne et récupérera chaque valeur de colonne.

0
mrd