我尝试在Android中使用快速搜索框制作字典。如SearchableDictionary教程所示,它加载所有(999个定义)数据,并将它们用作输入文本的匹配项以获取搜索建议。就我而言,当用户在QSB上输入一个单词时,我需要建议26963行数据。因此,我想从QSB逐个获取char数据,以便有效地加载必要的建议。我怎么能这样做?
这是我使用的代码......
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来收集数据。其他代码与教程相同......
答案 0 :(得分:1)
检索游标通常很慢。您只想检索一个包含所有匹配结果的游标。
您应该使用SQL执行搜索而不是获取所有内容。对于文本匹配,FULL_TEXT
搜索通常最快,但实现起来比简单LIKE
稍微复杂一些,但我强烈建议您尝试一下。
所以你想要执行一个SQL语句,如:
SELECT * FROM my_table WHERE subject_column MATCH 'something'
有关详细信息,请参阅SQLite FTS Extension。您也可以使用通配符来匹配单词的一部分。
就搜索建议而言,返回超过约100个结果的确没有任何意义,因为通常没有用户愿意向下滚动那么远,所以你可以通过在末尾添加LIMIT 0, 100
来进一步加快速度。您的SQL语句。
如果可能的话,只有当用户输入的X字符数超过X个时才会开始获取游标(通常是3个,但在这种情况下,这可能不合适)。这样,您就不会执行可能会匹配数千件商品的搜索。
你似乎要打开许多游标,直到应用程序关闭它们,即使你实际上不再需要它们:而不是打电话给startManagingCursor
,只需确保在x.close()
之后调用if (x.moveToFirst()) { ... }
1}} - 这将更快地释放内存。
关于不相关的说明:请不要将变量和方法命名为ss
或bringIt()
,因为它会使代码难以阅读 - 什么是ss
和 <{em>} bringIt()
带来了什么?
答案 1 :(得分:0)
您可以查看full text search extension in SQL Lite。想法是让SQL查询仅获取匹配结果,而不是所有结果然后过滤。 Android SDK还有一个示例:com/example/android/searchabledict/DictionaryDatabase