移动应用开发实践-Task8-城市数据库模糊查询
目的
City增加lookup字段存放对象关键词组合,实现模糊查询数据库。
1.改写CityDatabase
(1)增加方法generateLookup,生成关键词组合字段。
private String generateLookup(City city) {
String name = city.getName();
String enName = city.getEnName();
String initialName = city.getInitialName();
String[] enNameArray = enName.split("\\s");
StringBuilder sb = new StringBuilder();
sb.append(name + " ");
sb.append(enName + " ");
sb.append(initialName + " ");
sb.append(enName.replaceAll("\\s", "") + " ");
//replace the white space in enName with empty ""
for (int i = 1; i < enNameArray.length; i++) {
sb.append(initialName.substring(0, i));
for (int j = i; j < enNameArray.length; j++) {
sb.append(enNameArray[j]);
}
//combine the initialName with enName
sb.append(" ");
}
return sb.toString();
}
组合字段的样式:北京的look_up:北京 bei jing bj 北京 bjing
(2)在encode方法种增加lookUp字段的具体内容。
private ContentValues enCodeCotentValues(City city) {// parse the city to ContentValues
ContentValues cv = new ContentValues();
...
cv.put(KEY_LOOK_UP, generateLookup(city));
...
return cv;
}
(3)增加模糊查询方法fuzzyQueryCityList。
public List<City> fuzzyQueryCityList(String match) {// search city list by KEY_LOOK_UP
if (TextUtils.isEmpty(match)) {
return queryAllProvinces();
}
String sql = String.format("select * from %s where %s like ?", CITY_TABLE, KEY_LOOK_UP);
String[] args = new String[]{"%" + match + "%"};
List<City> list= getCityListBySql(sql, args);
return list;
}
2.配置CityAdapter
(1)编写CityAdapter的配置行页面
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingLeft="15dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="vertical"
android:paddingRight="5dp">
<TextView
android:id="@+id/city_row_view_province_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="right"
android:text="-----"
android:textSize="5sp" />
<TextView
android:id="@+id/city_row_view_city_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="right"
android:text="-----"
android:textSize="5sp" />
<TextView
android:id="@+id/city_row_view_county_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="right"
android:text="-----"
android:textSize="5sp" />
</LinearLayout>
<TextView
android:id="@+id/city_row_view_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:text="TextView"
android:textSize="16sp" />
</LinearLayout>
效果:可以通过左侧横条来表示不同的level
(2)CityAdapter的具体配置
package com.example.fyn_weather_task8_0.view;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.example.fyn_weather_task8_0.R;
import com.example.fyn_weather_task8_0.data.City;
import java.util.List;
public class CityAdapter extends ArrayAdapter<City> {
private List<City> list;
private Context context;
public CityAdapter(@NonNull Context context, @NonNull List<City> list) {
super(context, android.R.layout.simple_list_item_1, list);
this.list = list;
this.context = context;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
View view;
if (convertView == null) {
view = LayoutInflater.from(context).inflate(R.layout.city_row_view, null, false);
} else {
view = convertView;
}
TextView textView = (TextView)view.findViewById(R.id.city_row_view_tv);
TextView textView0 = (TextView)view.findViewById(R.id.city_row_view_province_tv);
TextView textView1 = (TextView)view.findViewById(R.id.city_row_view_city_tv);
TextView textView2 = (TextView)view.findViewById(R.id.city_row_view_county_tv);
City city = list.get(position);
textView.setText(city.toString());
switch (city.getLevel()){
case 0:
textView0.setVisibility(View.VISIBLE);
textView1.setVisibility(View.VISIBLE);
textView2.setVisibility(View.VISIBLE);
break;
case 1:
textView0.setVisibility(View.GONE);
textView1.setVisibility(View.VISIBLE);
textView2.setVisibility(View.VISIBLE);
break;
case 2:
textView0.setVisibility(View.GONE);
textView1.setVisibility(View.GONE);
textView2.setVisibility(View.VISIBLE);
break;
}
return view;
}
}
3.主函数MainActivity改写
package com.example.fyn_weather_task8_0;
import ...
public class MainActivity extends AppCompatActivity {
...
SearchView searchView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_main);
...
searchView = findViewById(R.id.search_view);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
List<City> list = cityDatabase.fuzzyQueryCityList(newText);
updateListView(list);
return false;
}
});
...
}
...
...
private void updateListView(List<City> list) {
adapter = new CityAdapter(this, list);
listView.setAdapter(adapter);
}
...
}