Оптимизация базы данных словаря SQLite - PullRequest
1 голос
/ 24 декабря 2011

Я пишу приложение для словаря.У меня есть большая статическая база данных SQLite с одной таблицей (100k + строки) и столбцами »_id«, »word« и »description«.Записи лексикографически упорядочены по »слову«.Я использую приведенный ниже код и afterTextChanged (Editable searchText) для мгновенного поиска в базе данных, загрузки выбранных строк в ArrayList и оттуда в адаптер списка.Код работает, однако он не очень эффективен, то есть:

  • Поиск слов, начинающихся с »z«, выполняется намного медленнее, чем поиск слов, начинающихся с »a«.
  • Послеввод »abc«, когда пользователь вводит »d«, поиск »abcd« начинается с самого начала, а не с первого появления »abc«.
  • Запросы для несуществующих строк выполняются очень долго, но мы знаем, что говорят, »Abcdx« может появляться только между »abcd« и »abce«.

Есть ли способ оптимизировать эти свойства?Есть ли готовые решения для словарей?Извините, я новичок в этом.

Например, я не могу заменить »LIKE« на »> =«, так как слова также состоят из некоторых не-ASCII символов, а запрос »> =« не работает с ними.

//---retrieves a database subset in the range (MATCH-RowsBefore, MATCH+RowsAfter)---
public Cursor getSearch(Editable typedKeys) throws SQLException 
{
    Cursor sCursor =
            db.rawQuery("SELECT _id, word FROM dict WHERE word LIKE ? LIMIT 1", 
            new String[]{typedKeys + "%"});
    if (sCursor.moveToFirst()) {
        SearchedRow = Integer.parseInt(sCursor.getString(0));
        int newstart = SearchedRow - RowsBefore;
        String curlen = Integer.toString(RowsBefore + RowsAfter + 1);
        sCursor = db.query(true, DB_TABLE, new String[] {_id,
                word}, _id + ">=" + newstart, null, null, null, null, curlen);
    }
    return sCursor;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...