java - 使用 SimpleCursorAdapter 使用多个 SQL 列填充单个 TextView(搜索框的建议)
问题描述
我使用 SQL 作为数据源。我的应用程序的搜索框有自动提示,但目前它只能返回 1 列(例如 column1)的结果。我希望它能够在 2 列中搜索(因此,column1 + column2)并在自动建议下拉列表中显示两列的结果。这是我试图实现该方法的代码,但没有任何成功。
public void LoadSuggestions(){
final String[] from = new String[] {"column1", "column2"};
final int[] to = new int[] {R.id.suggestion_text}; //suggestion_text is the TextView to populate
suggestionAdapter = new SimpleCursorAdapter(MainActivity.this,
R.layout.suggestion_row,null, from, to,0){
@Override
public void changeCursor(Cursor cursor) {
super.swapCursor(cursor);
}
};
search.setSuggestionsAdapter(suggestionAdapter);
search.setOnSuggestionListener(new SearchView.OnSuggestionListener() {
@Override
public boolean onSuggestionClick(int position) {
CursorAdapter ca = search.getSuggestionsAdapter();
Cursor cursor = ca.getCursor();
cursor.moveToPosition(position);
String clicked_word = cursor.getString(cursor.getColumnIndex("column1"));
search.setQuery(clicked_word, false);
search.clearFocus();
search.setFocusable(false);
Intent intent = new Intent(MainActivity.this, WordMeaningActivity.class);
Bundle bundle = new Bundle();
bundle.putString(("column1",clicked_word);
intent.putExtras(bundle);
startActivity(intent);
return true;
}
@Override
public boolean onSuggestionSelect(int position) {
return true;
}
});
search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
String text = search.getQuery().toString();
Pattern p = Pattern.compile("[A-Za-züÜöÖőŐűŰáÁéÉíÍóÓúÚ \\-.]{1,25}");
Matcher m = p.matcher(text);
if(m.matches())
{
Cursor c = myDbHelper.getMeaning(text);
if(c.getCount()==0)
{
showAlertDialog();
}
else
{
search.clearFocus();
search.setFocusable(false);
Intent intent = new Intent(MainActivity.this, WordMeaningActivity.class);
Bundle bundle = new Bundle();
bundle.putString(("column1", text);
intent.putExtras(bundle);
startActivity(intent);
}
}
else
{
showAlertDialog();
}
return false;
}
@Override
public boolean onQueryTextChange(final String s) {
search.setIconifiedByDefault(false);
Pattern p = Pattern.compile("[A-Za-züÜöÖőŐűŰáÁéÉíÍóÓúÚ \\-.]{1,25}");
Matcher m = p.matcher(s);
if(m.matches()) {
Cursor cursorSuggestion = myDbHelper.getSuggestions(s);
suggestionAdapter.changeCursor(cursorSuggestion);
}
return false;
}
});}
这是它背后的 SQL 查询
public Cursor getSuggestions(String text) {
Cursor c= myDatabase.rawQuery("SELECT _id, column1, column2 FROM words WHERE column1 LIKE '"+text+"%' AND column2 LIKE '"+text+"%' LIMIT 40", null);
return c;}
我认为主要问题在这里:
final String[] from = new String[] {"column1", "column2"};
因为使用此顺序,如果我搜索某些内容,它将返回 column1 的列表,但如果我将顺序从 {"column1", "column2"} 更改为 {"column2", "column1"},自动建议将仅显示 column2 的结果. 我知道我应该用这条线做点什么:
final int[] to = new int[] {R.id.suggestion_text};
但我没有找到任何详细信息,只有一个解决方案,其中列将显示在不同的行中,但我需要两个结果都显示在一个下拉列表中。感谢您抽出宝贵时间阅读本文!
解决方案
好的,经过几天的休息后,我才清楚地看到,完成此操作的方法是更改此字符串:
Cursor c= myDatabase.rawQuery("SELECT _id, column1, column2 FROM words WHERE column1 LIKE '"+text+"%' AND column2 LIKE '"+text+"%' LIMIT 40", null);
对此:
Cursor c= myDatabase.rawQuery("SELECT _id, column1 FROM words WHERE column1 LIKE '"+text+"%' UNION SELECT _id, column2 FROM words WHERE column2 LIKE '"+text+"%' LIMIT 40", null);
这样,搜索将在两行中进行,因此将从两行中获取并显示建议。
推荐阅读
- python - 使用 Python 和 OpenCV 进行图像分割
- machine-learning - 训练计算机进行单词自动分割(非英语语言)
- python - Python zeep / 在请求消息中包含 XML 模式
- algorithm - 比较 O(logn) 与 O ((logn)^2) 的时间复杂度
- c# - C# Fire and Forget 任务和丢弃
- javascript - 如何为“动画响应图像网格”随机化图像
- python - 使用子列熔化数据框
- neo4j - 带有 MATCH、WHERE 的 NEO4J 查询不起作用
- ruby-on-rails - 由于 minitest 5.13.0(需要 ruby 2.2),将 rails 更新到 4.1.11(在 ruby 2.1)失败
- google-bigquery - Bigquery“FOR SYSTEM_TIME AS OF”功能保证数据恢复