Заполните один TextView несколькими столбцами SQL, используя SimpleCursorAdapter (предложение для окна поиска) - PullRequest
0 голосов
/ 05 апреля 2020

Я использую 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};

, но я не нашел никакой подробной информации по этому поводу, только решение, в котором столбцы были бы показаны в разных строках, но мне нужны оба результата чтобы показать в одном раскрывающемся списке. Спасибо за ваше время и за чтение!

1 Ответ

0 голосов
/ 14 апреля 2020

Хорошо, после нескольких дней отдыха я только что понял, что путь к достижению sh это меняет эту строку:

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);

Это Кстати, поиск будет происходить в обеих строках, поэтому предложения будут приниматься и показываться из обеих строк.

...