Курсор пуст, но запрос (предположительно) правильный

У меня очень странная проблема. Мой фрагмент выглядит так

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 сообщает, что база данных успешно открыта.

Я не могу найти здесь ошибку. И меня очень смущает эта проблема.

Ваш код вставки также будет полезен, также что происходит с rawQuery для всей таблицы (SELECT * FROM insulina), вы получаете счетчик выше 0?

Mark Keen 12.05.2018 20:28

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

Damian Ziółkowski 12.05.2018 20:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
34
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что запрос должен быть:

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, поэтому хочу «почувствовать» разницу. Я могу понять ваш код (он просто дает прогноз результатов, которые мне нужны), но почему результаты не отображаются, когда я хочу запросить их напрямую?

Damian Ziółkowski 12.05.2018 21:04

Думаю, ваш запрос работал бы в более старой версии Android, например в Jelly Bean. Однако в более поздних версиях Android ДОЛЖЕН предоставить selectionArgs и использовать ? в rawQuery, чтобы он работал. developer.android.com/reference/android/database/sqlite/…

Mark Keen 12.05.2018 21:11

Поэтому ... я буду помнить об этом. Еще раз большое спасибо!

Damian Ziółkowski 12.05.2018 21:27

Другие вопросы по теме