Пристегните людей, это странно. В настоящее время я работаю над 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;
}
Если вы регистрируете data.getCount(), вы получаете 1 запись? – Isaac
@ IsaacPayne Просто понял, что я отлаживаю совершенно неправильный метод, я отредактировал правильный метод, как вы предложили, и он отлично работает. Благодаря! – Jason