Как искать среди нескольких слов с помощью SearchView? - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь найти базу данных SQLite, используя SearchView.На данный момент я могу искать только по одному слову.

например, "Здравствуйте, меня зовут Боб, у меня есть кот"
Если бы мне пришлось искать одно слово из текста выше ("Боб"), будет отображаться вся строка.
Однако я хотел бы, чтобы вышеуказанный текст также отображался при поиске "bob cat" или "my name have".Поскольку это возвращает пустой список.

Эти данные отображаются в виде списка.

private void searchUsers(SearchView searchDB) {

    Cursor cursor = myDb.searchUsers(searchDB);

    if (cursor.getCount() == 0) {
        Toast.makeText(activity_symptcheck.this, "No data to show", Toast.LENGTH_SHORT).show();
    } else {
        while (cursor.moveToNext()) {
            listItem.add("Illness: " + "\n" + cursor.getString(1) + "\n" + "Symptoms: " + "\n" + cursor.getString(2) + "\n" + "Treatments: " + "\n" + cursor.getString(3));
        }
        cursor.close();
        myDb.close();
    }

    searchDB.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String searchTxt) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String searchTxt) {
            ArrayList<String> userslist = new ArrayList<>();

            for (String user : listItem) {
                if (user.toLowerCase().contains(searchTxt.toLowerCase())) {
                        userslist.add(user);
                    }
                }

            ArrayAdapter<String> adapter = new ArrayAdapter<String>(activity_symptcheck.this,
                    android.R.layout.simple_list_item_1, userslist);
            ListIllness.setAdapter(adapter);

            return true;
        }
    });
}

public Cursor searchUsers(SearchView searchDB) {
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery("SELECT * FROM "+TABLE_NAME+" WHERE "+COL_3+" LIKE '%"+searchDB.getQuery()+"%'"+searchDB.getQuery(), null);

    return cursor;
}

Ответы [ 4 ]

0 голосов
/ 28 февраля 2019

Я сделал это следующим образом:

  • Создать класс для ввода фильтра.когда пользователь нажимает кнопку поиска, назначьте все значения фильтра этому классу.

  • Создайте метод внутри класса модели, который возвращает true, если какое-либо из значений фильтра соответствует.Это принимает объект класса фильтра в качестве аргумента.

  • Теперь, когда пользователь нажимает кнопку поиска, выполняйте итерацию по каждому объекту в массиве.Назовите этот метод.Если он возвращает true, добавьте этот объект в новый массив фильтров.

Пример

---- Filter class -----
class FilterTrucks {

String location;
int capacityStart;
int capacityEnd;
Arraylist<String> availability;

}

---- You model class -----
class Mytrucks {

String name;
String location;
int capacity;
String availability;

boolean matchFilter(FilterTrucks filter) {

boolean locationMatch = filterMatchesLocation(filter);
if(locationMatch)
return true;

boolean matchCapacity = filterMatchesCapacity(filter);
if(matchCapacity)
return true;

return false;

}

boolean filterMatchesLocation(FilterTrucks filter)  {
return location.contains(filter.location);
}

boolean filterMatchesCapacity(FilterTrucks filter)  {
return  (capacity >= filter.capacityStart ||  capacity <= filter.capacityEnd)
}

----- Your activity -----

Arraylist<Mytrucks> filterArray = new Arraylist<>();

filter_search.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

//create filter object from user selected fields
FilterTrucks filter = new FilterTrucks();
filter.location = txtLocation.getText().toString(); 

for(Mytrucks truck : arraylist) {
if(truck.matchFilter(filter)) 
    filterArray.add(truck);
}
    }
});

//use filter array to populate recycler view

Надеюсь, это поможет.

0 голосов
/ 26 февраля 2019

Если вы разделяете свой ввод от текста редактирования по пробелам и сопоставляете его со строкой, вы можете получить лучший результат

String[] searchTextArray = searchText.split();
for (String user : listItem){
    for (String part : searchTextArray){
        if (user.toLowerCase().contains(part.toLowerCase()){
            userlist.add(user);
            break;
        }
     }
}

Имейте в виду, это непроверенный код.

собирая все совпадения, вы можете пометить совпадения в именах с помощью spannablestrings.

0 голосов
/ 26 февраля 2019

Если getQuery() возвращает String для поиска (например, "Bob cat"), тогда вы можете построить свой запрос следующим образом:

String toSearch = getQuery();
String pattern = "%" + toSearch.replace(" ", "%") + "%";
String query = "SELECT * FROM " + TABLE_NAME + " WHERE " + COL_3 + " LIKE " + pattern;
0 голосов
/ 26 февраля 2019

Вам нужно разбить строку на отдельные слова, а затем динамически построить запрос WHERE для сопоставления каждого слова.

Вы можете получить список всех слов, применив разделение к строке поиска по пробелам.

String[] words = "search string".split("\\s")

String query = "SELECT * FROM "+TABLE_NAME+" WHERE "+COL_3+" LIKE '%"+words[0]+"%'"

for(int i=1;i<words.length;i++){
    query += " AND '%"+words[i]+"%'"
}

Обновлено с \\ s

...