Как эффективно управлять поисковым предложением с помощью Android QSB?
Я пытаюсь сделать словарь, используя окно быстрого поиска в Android. Как показано в учебном пособии SearchableDictionary, он загружает все данные (999 определений) и использует их в качестве совпадений с входным текстом для получения предложения поиска. в моем случае у меня 26963 строки данных, которые нужно предложить, пока пользователь вводит слово в QSB. поэтому я хочу поочередно получить данные char из QSB, чтобы они эффективно загрузили необходимое предложение. Как я могу это сделать?
вот код, который я использую...
bringit(200);
if (Intent.ACTION_VIEW.equals(intent.getAction())) {
// from click on search results
//Dictionary.getInstance().ensureLoaded(getResources());
String word = intent.getDataString();
//if(word.length() > 3){bringit(10);}
Dictionary.Word theWord = Dictionary.getMatches(word).get(0);
launchWord(theWord);
finish();
} else if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
//SearchManager.
//String bb =
mTextView.setText(getString(R.string.search_results, query));
WordAdapter wordAdapter = new WordAdapter(Dictionary.getMatches(query));
//letsCount(query);
mList.setAdapter(wordAdapter);
mList.setOnItemClickListener(wordAdapter);
}
Log.d("dict", intent.toString());
if (intent.getExtras() != null) {
Log.d("dict", intent.getExtras().keySet().toString());
}
}
private void letsCount(String query) {
// TODO Auto-generated method stub
for(int i=0; i<query.length(); i++){
definite[i] = query.charAt(i);
}
}
public void bringit(int sum) {
// TODO Auto-generated method stub
String[] ss = new String[10];
Log.d("dict", "loading words");
for(int i=1; i<=sum; i++){
KamusDbAdapter a = new KamusDbAdapter(getApplicationContext());
a.open();
Cursor x = a.quick(String.valueOf(i));startManagingCursor(x);
if(x.moveToFirst()){
ss[0] = x.getString(1);
ss[1] = x.getString(2);
}
Dictionary.addWord(ss[0].trim(), ss[1].trim());
Log.v("Debug",ss[0]+" "+ss[1]);
//onStop();
}
}
Я использую SQLite для сбора данных. и другой код такой же, как учебник...
2 ответа
Получение курсора обычно происходит медленно. Вы хотите получить только один курсор, который содержит все соответствующие результаты.
Вы должны выполнять поиск с использованием SQL, а не извлекать все. FULL_TEXT
поиск, как правило, самый быстрый для сопоставления текста, однако его реализация несколько сложнее, чем простой LIKE
, но я настоятельно рекомендую вам попробовать.
Итак, вы хотите выполнить инструкцию SQL, например:SELECT * FROM my_table WHERE subject_column MATCH 'something'
Посмотрите Расширение SQLite FTS для получения дополнительной информации. Вы также можете использовать подстановочные знаки, чтобы соответствовать части слова.
С точки зрения поисковых запросов, на самом деле нет смысла возвращать более чем ~100 результатов, так как обычно ни один пользователь не удосуживается прокрутить эту страницу вниз, поэтому вы можете еще больше ускорить процесс, добавив LIMIT 0, 100
до конца вашего оператора SQL.
Если возможно, начните получать курсоры только после того, как пользователь ввел более X символов (обычно 3, но в вашем случае это может не подходить). Таким образом, вы не выполняете поиск, который потенциально может соответствовать тысячам элементов.
Похоже, вы оставляете множество курсоров открытыми, пока приложение не закроет их, даже если они вам больше не нужны: вместо вызова startManagingCursor
просто обязательно позвоните x.close()
после вашего if (x.moveToFirst()) { ... }
- это освободит память быстрее.
На несвязанном примечании: пожалуйста, не называйте ваши переменные и методы такими вещами, как ss
или же bringIt()
поскольку это делает код трудным для чтения - что такое ss
и что делает bringIt()
принести точно?
Вы можете взглянуть на расширение полнотекстового поиска в SQL Lite. Идея состоит в том, чтобы иметь запрос SQL, который выбирает только совпадающие результаты, а не все результаты, а затем фильтрует. Также есть пример для Android SDK: com / example / android / searchabledict / DictionaryDatabase