本系列记录一下跟随guolin大神学习的项目自己完成一个天气预报Android App.
需求分析
- 可以列出全国所有省市县
- 可以查看全国任意城市天气信息
- 可以自由切换城市,查看不同地区天气
- 有手动刷新和后台自动更新天气功能
数据来源
郭神提供的数据接口,包含全国省市县名称和编号信息:
省级单位:
http://guolin.tech/api/china
服务器会返回JSON格式数据
市级单位:在后面加上具体省份id即可
http://guolin.tech/api/china/16
县级单位以此类推:
http://guolin.tech/api/china/16/116
接着为了获取每个地区具体的天气情况需要注册和风天气的接口:
拿到自己App的API KEY
之后配合每个具体地区的weather_id即可查看天气信息,如:
http://guolin.tech/api/weathercityid=cn101190401&key=bc0418b57b2d4918819d3974ac1285d9
返回的数据如:
数据获取后接着做JSON解析工作即可。
创建数据库和表
第一阶段要做的就是创建好数据库和表,从而将服务器获取到的数据存储到本地。这里使用 LitePal来管理数据库。
首先创建目录结构 ,其中db包用于存放数据库模型相关的代码
gson包用于存放GSON模型相关的代码,
service包用于存放服务相关的代码
util包用于存放工具相关的代码。
添加相关依赖:
使用 LiteRal,可以用面向对象的思维来实现数据库相关操作,比如定义一个 Java bean,在Book类中我们定义了id、 author、 price、 pages、name这几个字段,并生成了相应的 getter和 setter方法。Book类就会对应数据库中的Book表,而类中的每一个字段分别对应了表中的每一个列,这就是对象关系映射最直观的体验。
在db下新建省市县三个bean来对应三张表,具体代码如下:
/**
*省信息表
*/
public class Province extends DataSupport {
private int id;//代号
private String provinceName;//省名
private int provinceCode;//省编号
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getProvinceName() {
return provinceName;
}
public void setProvinceName(String provinceName) {
this.provinceName = provinceName;
}
public int getProvinceCode() {
return provinceCode;
}
public void setProvinceCode(int provinceCode) {
this.provinceCode = provinceCode;
}
}
LiteRal进行表管理操作时不需要模型类有任何的继承结构,但是进行CRUD操作时就不行了,
必须要继承自 DataSupport类才行,因此这里我们需要把继承结构给加上。
/**
* 城市信息表
*/
public class City extends DataSupport {
private int id; //字段
private String cityName; //城市名称
private int cityCode; //城市代码
private int provinceId;//城市所属省份编号
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
public int getCityCode() {
return cityCode;
}
public void setCityCode(int cityCode) {
this.cityCode = cityCode;
}
public int getProvinceId() {
return provinceId;
}
public void setProvinceId(int provinceId) {
this.provinceId = provinceId;
}
}
/**
* 地区/县信息表
*/
public class County extends DataSupport {
private int id;
private String countyName;//县名
private String weatherId;//天气id
private int cityId;//所属县ID
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCountyName() {
return countyName;
}
public void setCountyName(String countyName) {
this.countyName = countyName;
}
public String getWeatherId() {
return weatherId;
}
public void setWeatherId(String weatherId) {
this.weatherId = weatherId;
}
public int getCityId() {
return cityId;
}
public void setCityId(int cityId) {
this.cityId = cityId;
}
}
接下来需要配置``litepal.xml`
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<dbname value ="MyWeatherApp"/>
<version value="1"/>
<list>
<mapping class="com.wz.myweatherapp.db.County"/>
<mapping class="com.wz.myweatherapp.db.City"/>
<mapping class="com.wz.myweatherapp.db.Province"/>
</list>
</litepal>
其中,< dbname>标签用于指定数据库名,< version>标签用于指定数据库版本号,
标签用于指定所有的映射模型,我们稍后就会用到。
最后还需要再配置一下 LitePalApplication,修改 Androidmanifest xml中的代码,如下所示:
<manifest xmlns:android