将FTS限制为我的应用中的特定行和列

时间:2017-09-16 11:18:18

标签: android sqlite

在我的应用中,我实际上有几个与搜索相关的问题。

这是我现在的搜索查询:

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)
  1. 我想将内部查询限制为特定列(文本搜索)和特定" Collection_ID"行。
  2. 当我使用ListViewTextView在应用中显示结果时,是否可以突出显示搜索用户输入的字词?

2 个答案:

答案 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) {

    }
});