Android中简易天气预报的设计与实现 (1)

写在前面

本文基于郭霖大神第一行代码中的欧酷天气,由于郭神的代码中很多接口已经不能使用了,笔者重新更换了接口,使其运行起来,并且增加了定位功能来获取本地天气。把App的GitHub地址贴出来,想要试一试的小伙伴可以去clone它,欧酷天气

预计实现的功能

  • 可以罗列出全国所有的省市县。
  • 可以自由的查看全国任意城市的天气信息。
  • 可以自由地切换城市,去查看其他城市的天气。
  • 提供手动更新以及后台自动更新天气的功能。
  • 可以自动定位到当前的地理位置,并查询其天气。

创建数据库和表

首先我们先想一下,如果要把全国的省市县进行罗列,我们会怎么去做呢? 有两种可能的方案,要不就是从网上去请求省市县数据,然后进行解析,一个一个的把其列出;要不就是有一个现成的数据库,我们把数据库的东西读出来,然后进行罗列。现在的处境就是可以从网上请求数据下来显示,然而却没有数据库,并且每次都进行网络请求的话,会大大拖慢程序的速度。所以我们准备采取折衷的方案,网络上请求数据之后存入相应的数据库,当第二次进行省市县的罗列的时候就可以直接从数据库中取出了,大大减少了网络请求的次数。

好了,现在我们开始创建数据库和表吧。

  1. 创建CoolWeatherOpenHelper类,该类继承于SQLiteOpenHelper类并管理着数据库的创建和版本控制。
  2. 总共要建立3张表,Province、City、County,分别代表省、市、县。
  3. 建表用的SQL语句如下:
/**
* Province表建表语句
*/
public static final String CREATE_PROVINCE = "create table Province ("
    + "id integer primary key autoincrement, "
    + "province_name text, "
    + "province_code text)";
/**
* City表建表语句
*/
public static final String CREATE_CITY = "create table City ("
    + "id integer primary key autoincrement, "
    + "city_name text, "
    + "city_code text, "
    + "province_id integer)";

/**
* County表建表语句
*/
public static final String CREATE_COUNTY = "create table County ("
    + "id integer primary key autoincrement, "
    + "county_name text, "
    + "county_code text, "
    + "city_id integer)";
  1. 重写onCreate()方法和onUpgrade()方法,其中onCreate()方法里包含建表语句,onUpgrade()方法由于暂时没有涉及到数据库更新,暂时不写。
@Override 
public void onCreate(SQLiteDatabase db) {
    db.execSQL(CREATE_PROVINCE);    //创建Province表
    db.execSQL(CREATE_CITY);    //创建City表
    db.execSQL(CREATE_COUNTY);  //创建County表
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}

创建JavaBean

一般我们在创建完数据库表之后,会去创建相对应的JavaBean类,我们分别创建Province、City、County这三个JavaBean类来分别对应数据库的三个表,分别为Province、City、County三个表。代码如下:

Province的创建如下:

public class Province {
    private int id;
    private String provinceName;
    private String 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 String getProvinceCode() {
        return provinceCode;
    }

    public void setProvinceCode(String provinceCode) {
        this.provinceCode = provinceCode;
    }
}

City的创建如下:

public class City {
    private int id;
    private String cityName;
    private String 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 String getCityCode() {
        return cityCode;
    }

    public void setCityCode(String cityCode) {
        this.cityCode = cityCode;
    }

    public int getProvinceId() {
        return provinceId;
    }

    public void setProvinceId(int provinceId) {
        this.provinceId = provinceId;
    }
}

County的创建如下:

public class County {
    private int id;
    private String countyName;
    private String countyCode;
    private int cityId;

    public String getCountyName() {
        return countyName;
    }

    public void setCountyName(String countyName) {
        this.countyName = countyName;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getCountyCode() {
        return countyCode;
    }

    public void setCountyCode(String countyCode) {
        this.countyCode = countyCode;
    }

    public int getCityId() {
        return cityId;
    }

    public void setCityId(int cityId) {
        this.cityId = cityId;
    }
}

到现在为止,我们已经完成了两项工作,建立数据库表和创建与数据库表相对应的JavaBean,完成了最基本的工作。在接下来的Android中简易天气预报的设计与实现 (2)中我们将会写出用来操控数据库的类和工具类来简化接下来程序的编写。