仿美團城市定位於城市選擇
專案有一個天氣預報的需求,但是要能進行切換城市,效果可愛的設計妹子直接指定要美團的效果。效果如下圖。翻了一遍CSDN,這玩意當然找現成的,重複造輪子的事不是我等高階開發工程師應該有的思想。當然順便也去github搜刮了一遍。發現以下不錯的文章:https://github.com/zaaach/CityPicker,本文基本都是參考此文修改的。
看到現成的還是那麼完美肯定有點滋滋滋的感覺,但是使用之後就會發現只是效果完美。至於資料作者放了一個古老的城市db檔案,很想問作者為啥不下載最新的全國地址。還想早點回家YY~~呢。不過對於一些第三方的總是不那麼完美嵌合到自己專案的事情屢見不鮮。沒辦法只能自己搞定了 ,下載專案開搞。
首先要解決資料來源問題。天氣預報的介面使用的是阿里雲市場的(這不是廣告,畢竟免費的才多說一句),連結在此:https://market.aliyun.com/products/57126001/cmapi014302.htmlspm=5176.730005.productlist.d_cmapi014302.G2abc3#sku=yuncode830200000
裡面有一個或者測試的介面。裡面3271個數據。基本涵蓋了全國的省市區。資料還是比較中肯的,公司專案只是拿天氣做做樣子,提高提高bi格,所以資料方面不是特別嚴格。通俗點就是能用就行。json裡面的需要整理整理,省份你是獲取不到天氣資訊的,估計只是想提供跟你們用省份劃分的吧,目前我們用的是首字母劃分,所以刪掉省份的東西。已經整理成json檔案了,各位看官需要在文章最後自取。
這邊還是稍微囉嗦一下怎麼整理的過程吧,發現github老有一些人索要最新的城市地址。懶,懶,懶。拿到city.json,這是天氣城市介面返回的json串。把省份刪掉的新的json串newcity.json。 關鍵的關鍵來了,操作資料庫。一開始想偷懶讓一直噠噠噠操作資料庫的同事展示風騷的一面,但是匯出來的是dbf檔案。格式不一樣吧想看看重新命名.db檔案行不行。最後還是失敗了,一直忽略了一個問題,mysql 與 sqllite 還是有點區別的。還是自己搞唄。睜開大眼看清楚,你們要的程式碼來了。先建立資料庫
public class CityOpenHelper extends SQLiteOpenHelper { public CityOpenHelper(Context context) { super(context, DBConfig.DB_CITY, null, 1); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("DROP TABLE IF EXISTS `city`"); final String CREATE_CITY = "create table city(" + "id integer primary key autoincrement," + "c_name text," + "c_pinyin text," + "c_code text," + "c_province text)"; db.execSQL(CREATE_CITY); String citylist = getFromAssets(CommonApplication.getApplication(), "newcity.json"); CityBean cityBean = new Gson().fromJson(citylist, CityBean.class); List<CityBean.ResultBean> result = cityBean.getResult(); for (int i = 0; i < result.size(); i++) { // 也可以用db的insert()函式插入 先宣告一個 ContentValues ContentValues values = new ContentValues(); values.put("c_name", result.get(i).getCity()); values.put("c_pinyin", Pinyin.toPinyin(result.get(i).getCity(), "")); values.put("c_code", result.get(i).getCityid()); values.put("c_province", ""); db.insert("city", null, values); } } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
使用到的getFromAssets()方法順便貼一下:
public class AssetsUtil {
public static String getFromAssets(Context context, String fileName){
InputStreamReader inputReader=null;
BufferedReader bufReader=null;
try {
inputReader = new InputStreamReader( context.getResources().getAssets().open(fileName) );
bufReader = new BufferedReader(inputReader);
String line="";
String Result="";
while((line = bufReader.readLine()) != null)
Result += line;
return Result;
} catch (Exception e) {
e.printStackTrace();
}finally {
if(inputReader != null){
try {
inputReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(bufReader != null){
try {
bufReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return "";
}
}
最後開啟執行緒建立就行。資料量有點大,還是開執行緒為秒,這要是卡著崩了測試妹子眼神都不好了呀!
ThreadPool.init().execute(new Runnable() {
@Override
public void run() {
CityOpenHelper cityOpenHelper=new CityOpenHelper(getApplicationContext());
SQLiteDatabase writableDatabase = cityOpenHelper.getWritableDatabase();
}
});
好了city.db出來了。在studio DeviceFile data/data/包名/database/city_list.db。
最後的最後替換作者的db檔案,把名字改成city_list就可以了。
執行一波大功告成。成功替換,交接產品,下班打卡,回家伺候老佛爺。
好像上傳不了檔案,不過方法已經給了,需要的留郵箱吧。