1. 程式人生 > >WheelView實現省市區三級聯動(數據庫實現版本號附帶完整SQL及數據)

WheelView實現省市區三級聯動(數據庫實現版本號附帶完整SQL及數據)

tdi delet avi ipp cte public lis 網上 count()

近期在實現收貨地址功能。用到了省市區三級聯動效果。網上找到一般都是xml或json,數據源陳舊改動麻煩,改動了一下使用數據庫方式實現了一下技術分享

數據源解決,因為數據量比較大通過初始化批量運行SQL的方式不合適,費時不說還easy出錯,我採用的是在電腦上創建好數據庫然後把數據庫文件放到程序裏邊,通過以下這種方法能夠把db文件復制到隨意文件夾下。demo中我把文件放在了raw文件夾下

/**
     *
     * @param inStream
     * @param fileNme 文件名稱
     * @param newPath 要拷貝到的目錄路徑
     */
    public void copyFile(InputStream inStream,String fileNme, String newPath) {
        try {
            int bytesum = 0;
            int byteread = 0;

            File file = new File(newPath);
            //保證目錄存在
            if (!file.exists()) {
                file.mkdir();
            }
            //假設文件存在覆蓋
            File newFile=new File(newPath+File.separator+fileNme);
            if(newFile.exists()){
                newFile.delete();
                newFile.createNewFile();
            }
            FileOutputStream fs = new FileOutputStream(newFile);
            byte[] buffer = new byte[1024 * 2];
            int length;
            while ((byteread = inStream.read(buffer)) != -1) {
                bytesum += byteread; //字節數 文件大小
                System.out.println(bytesum);
                fs.write(buffer, 0, byteread);
            }
            inStream.close();
            fs.close();
        } catch (Exception e) {
            System.out.println("拷貝文件操作出錯");
            e.printStackTrace();

        }
    }

有了數據庫文件僅僅須要通過下面方法就能夠對該數據庫做操作了,該方法返回的是給定數據庫的引用

/**
     * 打開數據庫文件
     * @return
     */
    public SQLiteDatabase openDataBase(){
        SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(
                DATABASES_DIR+DATABASE_NAME, null);
        return database;
    }

接下來就是查詢數據源了
/**
     *
     * @param db
     * @return 查詢全部的省
     */
    public List<ProvinceModel> getProvice(SQLiteDatabase db){
        String sql="SELECT * FROM t_address_province ORDER BY id";
        Cursor cursor = db.rawQuery(sql,null);
        List<ProvinceModel> list=new ArrayList<ProvinceModel>();

        if (cursor!=null&&cursor.getCount() > 0) {
            while (cursor.moveToNext()){
                ProvinceModel provinceModel=new ProvinceModel();
                provinceModel.ID=cursor.getString(cursor.getColumnIndex("id"));
                provinceModel.NAME=cursor.getString(cursor.getColumnIndex("name"));
                provinceModel.CODE = cursor.getString(cursor.getColumnIndex("code"));
                list.add(provinceModel);
            }
        }
        return list;
    }

    /**
     * 依據省code查詢全部的市
     * @param db
     * @param code
     * @return
     */
    public List<CityModel> getCityByParentId(SQLiteDatabase db,String code){
        String sql="SELECT * FROM t_address_city WHERE provinceCode=? ORDER BY id";
        Cursor cursor = db.rawQuery(sql,new String[]{code});
        List<CityModel> list=new ArrayList<CityModel>();

        if (cursor!=null&&cursor.getCount() > 0) {

            while (cursor.moveToNext()){
                CityModel cityModel=new CityModel();
                cityModel.ID=cursor.getString(cursor.getColumnIndex("id"));
                cityModel.NAME=cursor.getString(cursor.getColumnIndex("name"));
                cityModel.CODE = cursor.getString(cursor.getColumnIndex("code"));
                list.add(cityModel);
            }
        }
        return list;
    }

    /**
     * 依據市code查詢全部的區
     * @param db
     * @param code
     * @return
     */
    public List<DistrictModel> getDistrictById(SQLiteDatabase db,String code){
        String sql="SELECT * FROM t_address_town WHERE cityCode=?

ORDER BY id "; Cursor cursor = db.rawQuery(sql,new String[]{code}); List<DistrictModel> list=new ArrayList<DistrictModel>(); if (cursor!=null&&cursor.getCount() > 0) { while (cursor.moveToNext()){ DistrictModel districtModel=new DistrictModel(); districtModel.ID=cursor.getString(cursor.getColumnIndex("id")); districtModel.NAME=cursor.getString(cursor.getColumnIndex("name")); districtModel.CODE = cursor.getString(cursor.getColumnIndex("code")); list.add(districtModel); } } return list; }

有了數據源工作就完畢了三分之二了,通過繼承AbstractWheelTextAdapter實現自己的適配器以省為例
/**
 * Created by xuan on 16/1/7.
 */
public class ProvinceAdapter extends AbstractWheelTextAdapter {
    public List<ProvinceModel> mList;
    private Context mContext;
    public ProvinceAdapter(Context context,List<ProvinceModel> list) {
        super(context);
        mList=list;
        mContext=context;
    }

    @Override
    protected CharSequence getItemText(int index) {
        ProvinceModel provinceModel=mList.get(index);
        return provinceModel.NAME;
    }

    @Override
    public int getItemsCount() {
        return mList.size();
    }
}
再將Adapter給WheelView就能夠了 附上完整版Demo及SQL

WheelView實現省市區三級聯動(數據庫實現版本號附帶完整SQL及數據)