项目有一个天气预报的需求,但是要能进行切换城市,效果可爱的设计妹子直接指定要美团的效果。效果如下图。翻了一遍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 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就可以了。
运行一波大功告成。成功替换,交接产品,下班打卡,回家伺候老佛爷。
好像上传不了文件,不过方法已经给了,需要的留邮箱吧。
国际惯例:感谢作者:https://github.com/zaaach/CityPicker 开源万岁