Android: SQLite Query не связывает целочисленные параметры? - PullRequest
3 голосов
/ 31 января 2011

У меня проблемы при отправке запросов с параметрами в БД на платформе Android (2.2).Я создал таблицу следующим образом:

db.execSQL("CREATE VIRTUAL TABLE " + Msg._TABLE_NAME + " USING FTS3 ("
            + Msg._ID + " INTEGER, "
            (...)
            + Msg.READ + " SHORT DEFAULT 0,"
            + Msg.URGENT + " SHORT DEFAULT 0"
            + ");");

Затем я пытаюсь выполнить запрос с помощью параметризованного запроса:

String[] columns = new String[] {Msg.ROWID, Msg.TITLE, Msg.READ, Msg.URGENT};
(...)
getContentResolver().query(Msg.CONTENT_URI, columns, 
    Msg.URGENT + "=? AND " + Msg.READ + "=?" + , whereArgs, null);

, где whereArgs меняется для каждого запроса:

String[] urgentUnread = new String[]{"1", "0"};
String[] regularUnread = new String[]{"0", "0"};

но независимо от того, что он возвращает 0 результатов / строк, даже если данные существуют.Поставщик контента не изменяет параметры, и запрос ничего не возвращает, используя QueryBuilder, а также при вызове запроса «напрямую»:

Cursor c = db.query(tables, columns, where, whereArgs, groupBy, having, orderBy, limit);

Запрос работает, если я просто выполню String concat:

getContentResolver().query(Msg.CONTENT_URI, columns, 
    Msg.READ + "=0 AND " + Msg.URGENT + "=1", null, null);

но это, кажется, убивает цель запросов param и кеширует неприятно.Далвик жалуется (после выполнения большого количества запросов) на то, что в кеше нет места для запроса, и, по иронии судьбы, говорит мне использовать параметризованные запросы с '?'.Я хотел бы, поверьте мне:)

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

Где я ошибся?

Заранее спасибо.

1 Ответ

3 голосов
/ 25 февраля 2011

Это ОП, я продолжал исследовать и экспериментировать и пришел к выводу, что виноват FTS3. Так как мне нужно, чтобы данные были доступными для поиска по полному тексту , я создавал VIRTUAL TABLE USING FTS3, а затем привязка параметров не удалась.

Поскольку я не хочу напрямую запрашивать теневую таблицу (Msg_content), мое решение состоит в том, чтобы разбить данные на 2 связанные таблицы:

db.execSQL("CREATE TABLE " + Msg._TABLE_NAME + " (" +
    Msg._ID + PRIMARY_KEY_AUTOINC + 
    Msg.PRIORITY + " TEXT," +
    Msg.RECEIVED + " INTEGER," +
    Msg.MOBILE_STATUS + " INTEGER DEFAULT 0," +
    Msg.READ + " SHORT DEFAULT 0," +
    Msg.FLASH + " SHORT DEFAULT 0" +
");");

db.execSQL("CREATE VIRTUAL TABLE " + MsgText._TABLE_NAME + " USING FTS3 (" + 
    MsgText._ID + PRIMARY_KEY +
    MsgText.TITLE + " TEXT," +
    MsgText.CONTENT + " TEXT," +
    MsgText.KEYWORDS + " TEXT," +
    "FOREIGN KEY(" + MsgText._ID + ") " +
    "REFERENCES " + Msg._TABLE_NAME + "(" + Msg._ID + ") " +
");");

Затем я создал View для использования по запросам:

db.execSQL("CREATE VIEW IF NOT EXISTS " + View.MSG_CONTENT +
    " AS SELECT " +
    Msg._TABLE_NAME + "." + Msg._ID + ", " +
    Msg._TABLE_NAME + "." + Msg.READ + ", " +
    Msg._TABLE_NAME + "." + Msg.FLASH + ", " +
(...)
    MsgText._TABLE_NAME + "." + MsgText.TITLE + ", " +
    MsgText._TABLE_NAME + "." + MsgText.CONTENT +
    " FROM " + Msg._TABLE_NAME + ", " + MsgText._TABLE_NAME +
    " WHERE " + Msg._TABLE_NAME + "." + Msg._ID + "=" +
    MsgText._TABLE_NAME + "." + MsgText._ID);

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

Надеюсь, это поможет кому-то еще, кто может столкнуться с той же проблемой.

Приветствия
ПЭС

P.S. Проверил Мета и нормально ответить на себя , видимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...