Я пишу приложение для словаря.У меня есть большая статическая база данных 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;
}