在我的应用中,我实际上有几个与搜索相关的问题。
这是我现在的搜索查询:
SELECT Book_Name, PlainEng_Text, REF, Book_Number, Collection_ID
FROM Had_Table
WHERE Collection_ID = ...
AND ID IN (SELECT ID
FROM Had_Virtual_Table
WHERE Had_Virtual_Table MATCH ?)
CREATE VIRTUAL TABLE IF NOT EXISTS Had_Virtual_Table USING FTS4(
ID, PlainEng_Text, PlainArab_Text)
ListView
和TextView
在应用中显示结果时,是否可以突出显示搜索用户输入的字词?答案 0 :(得分:1)
在FTS表中,所有列都存储字符串。您应该删除ID
colunm而不是internal rowid
colunm。
要仅搜索列,请将该列与MATCH一起使用:
... WHERE PlainEng_Text MATCH ?
在FTS表中,只有全文搜索才有效;尝试限制Collection_ID
值会使其变慢。
答案 1 :(得分:0)
第一个问题
更正您的查询:在AND
Collection_ID = " + CID + " AND ID IN
之前留出空格
使用此查询
String sqlStr = "SELECT Book_Name, PlainEng_Text, REF, Book_Number, Collection_ID FROM Had_Table WHERE Collection_ID = " + CID + " AND ID IN (SELECT ID FROM Had_Virtual_Table WHERE Had_Virtual_Table MATCH ?)";
第二个问题
这不是您期望的解决方案,但这会给您一个想法
final TextView sampleText =(TextView)findViewById(R.id.tv_sample_text);
EditText ed_texthere =(EditText)findViewById(R.id.ed_texthere);
final String fullText = sampleText.getText().toString();
ed_texthere.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
String typedText = charSequence.toString();
if (typedText != null && !typedText.isEmpty()) {
int startPos = fullText.toLowerCase(Locale.US).indexOf(typedText.toLowerCase(Locale.US));
int endPos = startPos + typedText.length();
if (startPos != -1) {
Spannable spannable = new SpannableString(fullText);
ColorStateList blueColor = new ColorStateList(new int[][]{new int[]{}}, new int[]{Color.BLUE});
TextAppearanceSpan highlightSpan = new TextAppearanceSpan(null, Typeface.BOLD, -1, blueColor, null);
spannable.setSpan(highlightSpan, startPos, endPos, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
sampleText.setText(spannable);
} else {
sampleText.setText(fullText);
}
}
}
@Override
public void afterTextChanged(Editable editable) {
}
});