我正在尝试使用SearchView搜索SQLite数据库。截至目前,我只能用一个词搜索。
例如“你好,我的名字是鲍勃,我有一只猫” 如果我要从上面的文本中搜索一个单词(“Bob”),将显示整行。 但是我想在搜索“bob cat”或“我的名字有”时也会显示上面的文字。因为这会返回一个空白列表视图。
此数据显示在列表视图中。
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;
}
如果您通过空格分隔编辑文本中的输入并将其与字符串相匹配,则可能会获得更好的结果
String[] searchTextArray = searchText.split();
for (String user : listItem){
for (String part : searchTextArray){
if (user.toLowerCase().contains(part.toLowerCase()){
userlist.add(user);
break;
}
}
}
请注意,这是未经测试的代码。
如果您收集所有匹配项,您可以使用spannablestrings标记名称中的匹配项。
如果getQuery()
返回String
来搜索(比如“Bob cat”),那么你可以像这样构造你的查询:
String toSearch = getQuery();
String pattern = "%" + toSearch.replace(" ", "%") + "%";
String query = "SELECT * FROM " + TABLE_NAME + " WHERE " + COL_3 + " LIKE " + pattern;
您需要将字符串拆分为单独的单词,然后动态构建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
我是这样做的:
例
---- 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
希望这可以帮助。