SQLite странное поведение - PullRequest
6 голосов
/ 29 февраля 2020

Я хочу получить определенную ячейку из таблицы. Я хочу alarm_musi c (TEXT), где у меня есть часы (INTEGER) и минуты (INTEGER) (в предложении where) будильника, сохраненные в таблице тревог.
код, в котором выполняется запрос

mBhelperClass = new AlarmsDBhelperClass(this);
        db= mBhelperClass.getWritableDatabase();
        Cursor cursor = db.rawQuery("SELECT musicPath FROM alarms WHERE hours="+hour+" AND minutes="+min,null);
        Log.d("gaurnagSnooze",""+cursor.getCount());
        if (cursor.moveToFirst()) {
            songPath = cursor.getString(cursor.getColumnIndex(AlarmsDBhelperClass.MUSIC_PATH));
            Log.d("if executed! ","songpath initialized!");
        }
        cursor.close();

moveToFirst () возвращает FALSE, означая, что в таблице нет строк.
, но при запуске SELECT musicPath FROM alarms moveToFirst () возвращает TRUE .
как это возможно?

Ответы [ 4 ]

6 голосов
/ 03 марта 2020

Проблема: cursor.moveToFirst () вернул FALSE , что означает отсутствие существующих строк.

Решение: при вставке строк в таблицу я использовал формат часов 24hour Экземпляр календаря из подборщика времени и хранится в таблице. Но когда я попытался извлечь значение из базы данных, используя часы в качестве предложения where, я использовал 12Hour в формате Clock экземпляр экземпляра Calendar. который наверняка не даст никакого вывода, следовательно, не будут возвращены строки в качестве курсора, а cursor.moveToFirst () возвращает FLASE

3 голосов
/ 03 марта 2020

Возможно, этот ответ не поможет в вашей проблеме, но я надеюсь, что он поможет вам со стилем кода.

Вы можете настроить интерфейс таким образом для всех выбранных вами запросов

public interface SelectQuery {

    Cursor execute(SQLiteDatabase db);
}

А вот реализация вашего запроса с помощью этого интерфейса

public class MusicPathsByHoursAndMinutesQuery implements SelectQuery {

    private static final String TAG = MusicPathsByHoursAndMinutesQuery.class.getSimpleName();

    private static final String PRECOMPILED_QUERY_STATEMENT =
            "SELECT musicPath FROM alarms WHERE hours = ? and minutes = ?";

    private final int hours;
    private final int minutes;

    public MusicPathsByHoursAndMinutesQuery(int hours, int minutes) {
        this.hours = hours;
        this.minutes = minutes;
    }

    @Override
    public Cursor execute(SQLiteDatabase db) {
        final Cursor cursor = db.rawQuery(PRECOMPILED_QUERY_STATEMENT, getQueryArgs());

        if (BuildConfig.DEBUG) {
            Log.d(TAG, "Query: " + PRECOMPILED_QUERY_STATEMENT);
            Log.d(TAG, "With args: " + Arrays.toString(getQueryArgs()));
            Log.d(TAG, "Returned cursor with " + cursor.getCount() + " rows.");
        }

        return cursor;
    }

    private String[] getQueryArgs() {
        return new String[]{
                String.valueOf(hours),
                String.valueOf(minutes)
        };
    }
}

И его использование (ведение журнала также включено в режиме отладки)

Cursor cursor = new MusicPathsByHoursAndMinutesQuery(hours, minutes).execute(db);
2 голосов
/ 03 марта 2020

Этот запрос небезопасен, он может привести к нежелательному результату. Однако, если вы хотите использовать небезопасный режим, измените запрос ниже

"SELECT musicPath FROM alarms WHERE hours="+hour+" AND minutes="+min

К

"SELECT musicPath FROM alarms WHERE hours= '"+hour+"' AND minutes= '"+min+"'"

добавьте ' вокруг whereArgs.

Хотя это правильно но не рекомендуется ( unsafe )

рекомендуется ( safe ) включить ? в where clause в query и заменить их значениями из where args.

Cursor cursor = db.rawQuery("SELECT musicPath FROM alarms WHERE hours = ? AND minutes = ? ",new String[]{hour,min});
0 голосов
/ 09 марта 2020

попробуйте выбрать все

Курсор курсора = db.rawQuery ("SELECT musicPath ОТ АВАРИЙ WHERE 1 = 1", ноль);

, затем создайте предложение where, как упомянутое тело

Ваш запрос был неправильным

Cursor cursor = db.rawQuery("SELECT musicPath FROM alarms WHERE hours="+hour+" AND minutes="+min,null);
as min was not inside double quote +min

Вы могли бы сделать это

   String sql = "SELECT musicPath FROM alarms WHERE hours="+hour+" AND minutes="+min + " ;";

 Cursor cursor = db.rawQuery("SELECT musicPath FROM alarms WHERE hours = ? AND minutes = ? ",new String[]{hour,min});

Пример:

try (Cursor cursor = db.rawQuery(
                    "select * from " + SQLiteHelper.TABLE_USER +
                            " where " + SQLiteHelper.USER_CLM_REVOKE_TX_ID + " = ?",
                    new String[]{revokeTxId})) {
                if (cursor.moveToFirst()) {
                    return createUserChannelFromCursor(cursor);
                } else {
                    return null;
                }
            }
...