Android: запрос SQLite с проблемой между условиями - PullRequest
0 голосов
/ 28 сентября 2011

У меня есть таблица с такой схемой:

        db.execSQL("CREATE TABLE TBL_REMINDERS (" //
                + "FLD_YEAR INTEGER, " //
                + "FLD_MON INTEGER, " //
                + "FLD_DATE INTEGER, " //
                + "FLD_HOUR INTEGER, " //
                + "FLD_MIN INTEGER, " //
                + "FLD_EVENT TEXT" //
                + ")" //

, где поле FLD_MON находится в диапазоне [1,12], а FLD_DATE [1,31], FLD_HOUR [0,23], FLD_MIN [0,59]

и rawQuery для таблицы, как показано ниже, не возвращает набора результатов:

public List<Reminder> getRemindersBetween(int y1, int m1, int d1, int h1, int min1, int y2, int m2, int d2, int h2,
        int min2) {
    String sql = "SELECT FLD_YEAR, FLD_MON, FLD_DATE, FLD_HOUR, FLD_MIN, FLD_EVENT FROM TBL_REMINDERS "//
            + "WHERE (100000000 * FLD_YEAR + 1000000 * FLD_MON + 10000 * FLD_DATE + 100 * FLD_HOUR + FLD_MIN BETWEEN ? AND ?) " //
            + "ORDER BY FLD_YEAR, FLD_MON, FLD_DATE, FLD_HOUR, FLD_MIN, FLD_EVENT ";
    SQLiteDatabase db = null;
    Cursor cur = null;
    try {
        db = new CalendarDBOpenHelper(context).getReadableDatabase();
        cur = db.rawQuery(sql, new String[] { "" + (100000000 * y1 + 1000000 * m1 + 10000 * d1 + 100 * h1 + min1),//
                "" + (100000000 * y2 + 1000000 * m2 + 10000 * d2 + 100 * h2 + min2 - 1) //
        });
        List<Reminder> list = new ArrayList<Reminder>();
        while (cur.moveToNext()) {
            int year = cur.getInt(0);
            int mon = cur.getInt(1);
            int date = cur.getInt(2);
            int hour = cur.getInt(3);
            int min = cur.getInt(4);
            String event = cur.getString(5);
            list.add(new Reminder(year, mon, date, hour, min, event));
        }

        return list;
    } finally {
        if (null != cur) {
            try {
                cur.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if (null != db) {
            try {
                db.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

, тогда как другой rawQuery, как показано ниже, работает нормально:

public List<Reminder> getRemindersOfDate(int y, int m, int d) {
    String sql = "SELECT FLD_HOUR, FLD_MIN, FLD_EVENT FROM TBL_REMINDERS "//
            + "WHERE FLD_YEAR=? AND FLD_MON=? AND FLD_DATE=? " //
            + "ORDER BY FLD_HOUR, FLD_MIN, FLD_EVENT";

    SQLiteDatabase db = null;
    Cursor cur = null;

    try {
        db = new CalendarDBOpenHelper(context).getReadableDatabase();
        cur = db.rawQuery(sql, new String[] { "" + y, "" + m, "" + d });

        List<Reminder> reminders = new ArrayList<Reminder>();
        while (cur.moveToNext()) {
            int hour = cur.getInt(0);
            int min = cur.getInt(1);
            String event = cur.getString(2);
            reminders.add(new Reminder(y, m, d, hour, min, event));
        }
        return reminders;
    } finally {
        if (null != cur) {
            try {
                cur.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if (null != db) {
            try {
                db.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    } // finally
}

Я полагаю, что условие "между ... и ..." создает проблемы, поскольку это единственное различие между двумя запросами SQL.но я не уверен,

РЕДАКТИРОВАТЬ:

вещи становятся интересными.Теперь я уверен, что проблема вызвана наличием выражения в предложении where.Во втором методе, указанном выше, если я изменю

            + "WHERE FLD_YEAR=? AND FLD_MON=? AND FLD_DATE=? " //

на

            + "WHERE 10 * FLD_YEAR=? AND FLD_MON=? AND FLD_DATE=? " //

, а также

        cur = db.rawQuery(sql, new String[] { "" + (10 * y), "" + m, "" + d });

, тогда я ничего не получу

1 Ответ

0 голосов
/ 28 сентября 2011

Хорошо, прежде всего: они определенно не одинаковы.

Первый возвращает совпадающие записи за определенный промежуток времени.
Вторая возвращает записи, в которых месяц, год и дата имеют заданные значения.

Редактировать

Попробуйте использовать фигурные скобки для выражения, поэтому (10 * FLD_YEAR)

...