У меня очень странная проблема. Мой фрагмент выглядит так
public Wynik getData(int pomiar, int godzina) {
Wynik wynik = null;
String query = "SELECT * FROM " + "insulina" + " WHERE godzina = " + godzina +
" AND cukier = " + pomiar;
SQLiteDatabase db = this.getReadableDatabase();
try (Cursor cursor = db.rawQuery(query, null)) {
Log.i("tag", "cursor length:" + cursor.getCount());
if (cursor.getCount() > 0) {
String s = DatabaseUtils.dumpCursorToString(cursor);
Log.d("s", s);
cursor.moveToFirst();
wynik = new Wynik
(cursor.getInt(cursor.getColumnIndexOrThrow("godzina")),
cursor.getString(cursor.getColumnIndexOrThrow("insulina")),
cursor.getInt(cursor.getColumnIndexOrThrow("dawka")),
cursor.getString(cursor.getColumnIndexOrThrow("cialo")));
}
cursor.close();
return wynik;
(извините за не английскую конвенцию, но это должно было быть быстрым, стандартным проектом)
Вся идея приложения - помочь моему другу с диабетом его бабушки. Он вставлял результат теста на уровень сахара в крови (cukier), и время теста проверялось автоматически (годзина). Исходя из этого, приложение должно возвращать полный результат (wynik) с необходимой дозой инсулина (dawka), его типом (insulina) и частью тела, из которого следует взять кровь (cialo).
Так например. Результат крови - 10 (это единственное, что вводит пользователь), и сейчас 7 вечера (19, по 24-часовому соглашению - программа дает ближайший час теста, поэтому он 18). Итак, запрос выглядит так
SELECT * FROM insulina WHERE godzina = 18 AND cukier = 10
И вот моя проблема. Приложение распознает длину курсора как 0 (она должна быть 1), даже если мое другое приложение, связанное с созданием базы данных (браузер БД для SQLite), правильно выдает мой результат с тем же запросом

Также Android Studio сообщает, что база данных успешно открыта.
Я не могу найти здесь ошибку. И меня очень смущает эта проблема.
@MarkKeen Когда rawQuery запрашивает всю таблицу, длина выглядит нормально («I / tag: длина курсора: 98»). Для этой базы данных нет кода вставки. Это готовая база данных.




Я думаю, что запрос должен быть:
String query = "SELECT * FROM insulina WHERE godzina = ? AND cukier = ?";
SQLiteDatabase db = this.getReadableDatabase();
try (Cursor cursor = db.rawQuery(query, new String[]{String.valueOf(godzina), String.valueOf(pomiar)})) {
//... rest of code
Также похоже, что вы используете «попробуйте с ресурсами», поэтому закрытие явно не требуется.
Оно работает! Большое спасибо! Хочу задать дополнительный вопрос. Я вроде как новичок в Java, поэтому хочу «почувствовать» разницу. Я могу понять ваш код (он просто дает прогноз результатов, которые мне нужны), но почему результаты не отображаются, когда я хочу запросить их напрямую?
Думаю, ваш запрос работал бы в более старой версии Android, например в Jelly Bean. Однако в более поздних версиях Android ДОЛЖЕН предоставить selectionArgs и использовать ? в rawQuery, чтобы он работал. developer.android.com/reference/android/database/sqlite/…
Поэтому ... я буду помнить об этом. Еще раз большое спасибо!
Ваш код вставки также будет полезен, также что происходит с rawQuery для всей таблицы (
SELECT * FROM insulina), вы получаете счетчик выше 0?