Курсор в то время как цикл возвращает все значения, кроме последнего - PullRequest
6 голосов
/ 02 апреля 2010

Я использую цикл while, чтобы перебрать курсор, а затем вывести значения долготы и широты каждой точки в базе данных.

По некоторым причинам он не возвращает последний (или первый, в зависимости от того, использую ли я Cursor.MoveToLast) набор значений долготы и широты в курсоре.

Вот мой код:

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

От этого я получаю:


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 / System.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 / System.out (10551): 1,0 04-02 15: 39: 07.493: INFO / System.out (10551): 1,0


7 Наборов значений, где я должен получить 8 наборов.

Спасибо.

Ответы [ 4 ]

22 голосов
/ 02 апреля 2010

moveToNext () имеет две функции. Он возвращает логическое значение, означающее, что означает следующий, но в то же время он идет вперед и перемещает курсор.

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());
}
5 голосов
/ 02 апреля 2010
Cursor c=null;
c=......;
try {
    if (c!=null) {
        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {

        }

    }
} finally {
    if (c!=null) {
        c.close();
    }
}
4 голосов
/ 02 апреля 2010

На самом деле вы пропустили первое значение, а не последнее.

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

Первый раз в цикле while вы указываете на 2-й ряд.

Я бы преобразовал ваш цикл while в цикл do-while

3 голосов
/ 03 апреля 2010

Вы только что выполнили запрос. Разве вы не можете просто избавиться от 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...