2010-04-02 16 views
6

Estoy usando un ciclo while para recorrer un cursor y luego generar los valores de longitud y latitud de cada punto dentro de la base de datos.Cursor while loop que devuelve todos los valores excepto el último

Por alguna razón, no devuelve el último (o el primero, según si uso Cursor.MoveToLast) el conjunto de valores de longitud y latitud en el cursor.

Aquí está mi código:

public void loadTrack() { 
SQLiteDatabase db1 = waypoints.getWritableDatabase(); 
Cursor trackCursor = db1.query(TABLE_NAME, FROM, "trackidfk=1", null, null, null,ORDER_BY); 

    trackCursor.moveToFirst(); 
    while (trackCursor.moveToNext()) { 
     Double lat = trackCursor.getDouble(2); 
     Double lon = trackCursor.getDouble(1); 
     //overlay.addGeoPoint(new GeoPoint((int)(lat*1E6), (int)(lon*1E6))); 
     System.out.println(lon); 
     System.out.println(lat); 
    } 
} 

A partir de este que estoy recibiendo:


04-02 15: 39: 07,416: INFO/System.out (10551): 3.0 04 -02 15: 39: 07.416: INFO/System.out (10551): 5.0 04-02 15: 39: 07.416: INFO/System.out (10551): 4.0 04-02 15: 39: 07.416: INFO/System.out (10551): 5.0 04-02 15: 39: 07.416: INFO/System.out (10551): 5.0 04-02 15: 39: 07.416: INFO/System.out (10551): 5.0 04-02 15: 39: 07.416: INFO/System.out (10551): 4.0 04-02 15: 39: 07.416: INFO/Sistema. out (10551): 4.0 04-02 15: 39: 07.416: INFO/System.out (10551): 3.0 04-02 15: 39: 07.416: INFO/System.out (10551): 3.0 04-02 15: 39: 07.416: INFO/System.out (10551): 2.0 04-02 15: 39: 07.416: INFO/System.out (10551): 2.0 04-02 15: 39: 07.493: INFO/Sistema. out (10551): 1,0 04-02 15: 39: 07,493: INFO/System.out (10551): 1,0


7 conjuntos de valores, donde debería estar recibiendo 8 conjuntos.

Gracias.

Respuesta

22

MoveToNext() tiene dos funciones. Devuelve un valor booleano que significa que es el siguiente, pero al mismo tiempo avanza y mueve el cursor.

public void loadTrack() { 
SQLiteDatabase db1 = waypoints.getWritableDatabase(); 
Cursor trackCursor = db1.query(TABLE_NAME, FROM, "trackidfk=1", null, null, null,ORDER_BY); 

    trackCursor.moveToFirst(); 
    do { 
     Double lat = trackCursor.getDouble(2); 
     Double lon = trackCursor.getDouble(1); 
     //overlay.addGeoPoint(new GeoPoint((int)(lat*1E6), (int)(lon*1E6))); 
     System.out.println(lon); 
     System.out.println(lat); 
    } while (trackCursor.moveToNext()); 
} 
+2

Asegúrate de usar try catch. – Pentium10

+5

Es probable que desee algo para asegurarse de que hay un primer elemento, que probablemente no irá demasiado bien si alguna vez termina en uno vacío. – AaronM

4

Su omisión del primer valor en realidad, no el último.

trackCursor.moveToFirst(); 
while (trackCursor.moveToNext()) { 

La primera vez en el ciclo while está apuntando a la 2da fila.

Me gustaría convertir su while loop to a do-while loop

+0

Probé el hacer mientras, pero como el número de filas devuelto podría ser cualquier número, no estaba seguro de cuál debería ser la expresión while. – jcrowson

+0

do {...} while (trackCursor.moveToNext()) Es la misma expresión while que estás usando actualmente. –

5
Cursor c=null; 
c=......; 
try { 
    if (c!=null) { 
     for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) { 

     } 

    } 
} finally { 
    if (c!=null) { 
     c.close(); 
    } 
} 
3

Acaba de realizar la consulta. ¿No puedes deshacerte de moveToFirst()?

public void loadTrack() { 
SQLiteDatabase db1 = waypoints.getWritableDatabase(); 
Cursor trackCursor = db1.query(TABLE_NAME, FROM, "trackidfk=1", null, null, null,ORDER_BY); 

    while (trackCursor.moveToNext()) { 
     Double lat = trackCursor.getDouble(2); 
     Double lon = trackCursor.getDouble(1); 
     //overlay.addGeoPoint(new GeoPoint((int)(lat*1E6), (int)(lon*1E6))); 
     System.out.println(lon); 
     System.out.println(lat); 
    } 
} 
Cuestiones relacionadas