Android SQLite очень медленный поиск - PullRequest
2 голосов
/ 24 февраля 2012

Я пытаюсь создать приложение для словаря на Android. У меня есть база данных 80000 статей. Когда пользователь вводит слово в EditText, я хочу показать предложения в ListView. Для этого я использую следующий код:

    public Cursor query(String entry){
             String[] columns = new String[]{"_id", "word"};
             String[] selectionArgs = new String[]{entry + "%"};
             return mDB.query("word", columns, "word LIKE ?", selectionArgs, null, null, null);
    }

и я использую SimpleCursorAdapter для ListView.

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

Ответы [ 3 ]

4 голосов
/ 24 февраля 2012

Вы можете обнаружить, что добавление индекса в столбец word очень помогает. См. документацию .

Таким образом, вы можете попробовать это сразу после создания таблицы:

CREATE INDEX word_idx ON word (word);

(Примечание: я не уверен, что если таблица и столбец с именем word вызовут здесь синтаксические проблемы. Попробуйте и посмотрите!)

1 голос
/ 24 февраля 2012

Помимо очевидного индекса, вы должны использовать полнотекстовый поиск с MATCH вместо like, если это словарь. Android должен поддерживать FTS3.

Проверьте http://www.sqlite.org/fts3.html и некоторые ответы здесь на SO относительно fts3 на Android.

Кажется, слова должны начинаться со строки. Может быть, этот тип уловки может помочь: SQLite FTS3 имитировать LIKE somestring%

1 голос
/ 24 февраля 2012

В качестве простой альтернативы вы можете ограничить предложения в произвольном порядке с помощью Limit, как в этом посте: Использование оператора LIMIT в запросе SQLite

mDB.query("word", columns, "word LIKE ?", selectionArgs, null, null, null, "LIMIT 150" );

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

Кроме того, вы все равно не сможете показывать сумасшедшее количество предложений, так что вы можете просто использовать некоторое количество фиксированных лимитов в зависимости от вашего пользовательского интерфейса.Я привел 150 в качестве примера.

Надеюсь, это поможет ..

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