2016-12-27 3 views
0

Пристегните людей, это странно. В настоящее время я работаю над Android-приложением, которое включает в себя хранение и извлечение данных в базе данных sqlite. Я проходил через приложение и тестировал некоторые из основных функций, чтобы убедиться, что все работает, и вот и я обнаружил ошибку при извлечении данных из моей базы данных. Когда пользователь вводит свою первую запись в приложение, все работает так, как ожидалось, значения обрабатываются и сохраняются. Однако, когда я возвращаюсь и пытаюсь получить доступ к этим данным, используя SELECT * FROM history;, я получаю курсор, который возвращает true, когда я вызываю data.moveToNext(), но когда я его прохожу через while(data.moveToNext()) { //get values and add to a List<> }, цикл while никогда не будет выполнен.Android-запрос SQL, не распознающий первую запись

Я просмотрел содержимое базы данных после перемещения файла на свой компьютер и открытия базы данных с помощью db-браузера, и я вижу свою запись.

Вот метод, который я называю, чтобы получить все точки из моей базы данных:

List<PointValue> getAllPoints() { 
    List<PointValue> points; 
    Cursor data = rawQuery("SELECT * FROM history"); 
    if (data.moveToNext()) { 
     points = new ArrayList<>(); 
     while (data.moveToNext()) { 
      System.out.println("Looped"); 
      long timestamp = data.getLong(data.getColumnIndexOrThrow("timestamp")); 
      int level = data.getInt(data.getColumnIndexOrThrow("level")); 
      points.add(new PointValue(timestamp, level)); 
     } 
    } else { 
     return null; 
    } 
    data.close(); 
    if (points.size() == 0) { 
     return null; 
    } 
    return points; 
} 

Метод rawQuery выглядит следующим образом:

private Cursor rawQuery(String sql) { 
    SQLiteDatabase db = this.getReadableDatabase(); 
    return db.rawQuery(sql, null); 
} 

Когда я попытался отладки это сам, то размер points равен 0, хотя I знает, что в базе данных есть как минимум одна точка. Мысли? Класс, содержащий все мои SQL вещи, связанные расширяет SQLiteOpenHelper

EDIT: Вот решение было предложено @Isaac Payne (до сих пор не работает):

public List<PointValue> getAllPoints() { 
    List<PointValue> points = new ArrayList<>(); 
    Cursor data = rawQuery("SELECT * FROM history"); 

    while (data.moveToNext()) { 
     long timestamp = data.getLong(data.getColumnIndexOrThrow("timestamp")); 
     int level = data.getInt(data.getColumnIndexOrThrow("level")); 
     points.add(new PointValue(timestamp, level)); 
    } 
    data.close(); 
    if (points.size() == 0) { 
     return null; 
    } 
    return points; 
} 
+0

Если вы регистрируете data.getCount(), вы получаете 1 запись? – Isaac

+0

@ IsaacPayne Просто понял, что я отлаживаю совершенно неправильный метод, я отредактировал правильный метод, как вы предложили, и он отлично работает. Благодаря! – Jason

ответ

4

Проблема в том, что, когда вы звоните в data.moveToNext() оператор if, который вы переходите к первой записи, затем вы вызываете moveToNext() снова в своем цикле while, перемещаясь ко второй несуществующей записи. Попробуйте удалить оператор if

+0

Если есть метод, который возвращает количество записей в ответе, вы можете использовать 'if (data.numRecords()> 0)' вместо этого. – Barmar

+0

Не повезло, обновленный метод находится в нижней части моего первоначального вопроса – Jason

0

Добавить data.moveToFirst() перед циклом if.

Cursor data = rawQuery("SELECT * FROM history"); 
//add this line 
data.moveToFirst(); 
if (data.moveToNext()) {