10 Stimmen

Android cursor.moveToNext()?

Ich versuche, alle Spalten in einer Tabelle in einer langen Textansicht und/oder Zeichenfolge abzufragen. Ich weiß, dass dies vielleicht nicht der richtige Weg ist, aber ich muss dies tun. Korrigieren Sie mich, wenn ich falsch bin, ich hatte den Eindruck, dass move next die nächste Spalte in der Zeile erhalten würde:

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

Ich dachte, dies würde die erste Spalte abrufen und ihren gesamten Inhalt anzeigen, stattdessen erhalte ich die erste Spalte und die erste Zeile. Was mache ich falsch? Gibt es eine bessere oder echte Möglichkeit, diese Informationen zu erhalten, ohne eine ListView zu verwenden?

38voto

Pla Punkte 469

Die Anwendung ist einfach:

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

moveToFirst wird verwendet, wenn Sie die Iteration von Anfang an beginnen müssen, nachdem Sie bereits eine bestimmte Position erreicht haben.

Vermeiden Sie die Verwendung von cursor.getCount(), es sei denn, sie ist erforderlich. Und verwenden Sie niemals eine Schleife über getCount().

getCount ist teuer - es durchläuft viele Datensätze, um sie zu zählen. Es gibt keine gespeicherte Variable zurück. Bei einem zweiten Aufruf kann es zu einer Zwischenspeicherung kommen, aber der erste Aufruf kennt die Antwort nicht, bis sie gezählt ist.

Wenn Ihre Abfrage 1000 Zeilen ergibt, enthält der Cursor nur die erste Zeile. Jedes moveToNext sucht und findet die nächste Übereinstimmung. getCount muss alle 1000 finden. Warum über alle iterieren, wenn Sie nur 10 benötigen? Warum zweimal iterieren?

Wenn Ihre Abfrage keinen Index verwendet, kann getCount sogar noch langsamer sein - getCount kann mehr als 10000 Datensätze umfassen, obwohl die Abfrage nur 100 Treffer enthält. Warum eine Schleife von 20000 statt 10000?

12voto

user1720179 Punkte 168

Zur Verdeutlichung ein vollständiges Beispiel wäre wie folgt, die ich hoffe, ist von Interesse. Wie in den Code-Kommentaren angegeben, durchlaufen wir im Wesentlichen Datenbankzeilen und dann Spalten, um eine Datentabelle gemäß der Datenbank zu bilden.

    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();
    }

2voto

mrd Punkte 4374

Ich kodiere meine Schleifen über den Spiegel wie folgt:

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

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

        cursor.moveToNext();
    }

Das funktioniert immer. Damit werden die Werte der Spalte "spalte_name" aller Zeilen abgerufen. Ihr Fehler ist, dass Sie eine Schleife über die Zeilen und nicht über die Spalten ziehen. Um eine Schleife über die Spalten zu machen:

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

Dies führt zu einer Schleife über die Spalten der ersten Zeile und ruft den Wert jeder Spalte ab.

1voto

CChi Punkte 2904

MoveToNext verschiebt den Cursor in die nächste Zeile. und c.getString(0) liefert immer die erste Spalte, wenn es eine gibt. Ich denke, Sie sollten innerhalb Ihrer Schleife etwas Ähnliches wie das hier tun

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

1voto

Raunak Punkte 6297

cursor.moveToFirst() bewegt den Cursor in die erste Zeile. Wenn Sie wissen, dass Sie 6 Spalten haben, und Sie wollen eine Zeichenkette, die alle Spalten enthält, versuchen Sie Folgendes.

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();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X