移动应用开发实践-Task8-城市数据库模糊查询

移动应用开发实践-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);
    }
	...
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值