Android SQLite ВЫБРАТЬ ГДЕ НРАВИТСЯ неожиданное поведение - PullRequest
2 голосов
/ 23 октября 2011

У меня есть приложение для Android с базой данных SQLite, и я пытаюсь реализовать интерфейс поиска.Прежде всего, я понимаю, что создание базы данных FTS - это путь, но я подумал, что мог бы использовать оператор LIKE и получить аналогичные результаты, если бы использовал подстановочные знаки.Таким образом, интерфейс может быть протестирован, а серверная часть обновлена ​​позже.

Вот как я строю запрос:

public Cursor getMatching(String query) {
    Cursor mCursor = db.query(false, TABLE, new String[] { KEY_ROWID,
            KEY_NAME }, KEY_NAME + " LIKE ?",
            new String[] { "%" + query + "%" }, null, null, null, null);
    if (mCursor != null) {
        mCursor.moveToFirst();
    }
    return mCursor;
}

KEY_NAME - текстовый столбец, для которого я хочу получить результаты, а запрос -строчная строка, с которой я хочу сопоставить.Я ожидаю, что он будет возвращать результаты, когда запрос появляется в любом месте имени, без учета регистра.Однако то, что я наблюдаю, отличается.Результаты запроса "" (пустая строка):

Coch**** ****
Squi*** St*****
Owe** ****
Smi** Ca****
G. Bur** Jo******
Gr******* Brown

Теперь, когда я запрашиваю "o":

Owe** ****
G. Bur** Jo******
Gr******* Brown

Как ни странно, первый результат отфильтровывается, хотя и содержит«о».Когда я запрашиваю «ow»:

Gr******* Brown

И наконец, когда я запрашиваю «own»:

null

Вот метод, который я использую для обработки курсора:

public static void logMatches(Context context, String query) {
    DBAdapter adapter = new DBAdapter(context);
    adapter.open();

    Cursor c = adapter.getMatching(query);

    if (c == null)
        return;

    while (c.moveToNext()) {
        String name = c.getString(c
                .getColumnIndex(DBAdapter.KEY_NAME));
        Log.d(TAG, name);
    }

    c.close();
    adapter.close();
}

Где DBAdapter содержит SQLiteOpenHelper.Контекст, который я передаю, исходит из ContentProvider с использованием метода getContext ().

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

1 Ответ

1 голос
/ 23 октября 2011

Я сам не пробовал, но FTS фактически реализован в SQLite для Android. См. Например здесь и здесь .

Ах да. Вместо while (c.moveToNext()) {} поставить do { } while (c.moveToNext())

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