zoukankan      html  css  js  c++  java
  • android开发学习之路——天气预报之技术分析与数据库(一)

        学习了郭霖老师的《第一行代码》,其中14章是介绍天气预报软件的设计。从而学习了如何设计一个实用性的android小程序。

    (一)功能需要及技术分析

        设计之前,我们先需要分析,这个软件需要具备哪些功能。

        ·可以罗列出全国所有的省、市、县;

        ·可以查看全国任意城市的天气信息;

        ·可以自由地切换城市,去查看其他城市地天气;

        ·提供手动更新以及后台自动更新天气的功能。

        这4个主要的功能点,如果要实现需要用到UI、网络、数据储存、服务等技术。比较需要综合应用的能力。如何获取到每个城市的天气信息,我们可以使用和风天气的接口,它的数据相对简单点。解决了天气问题,还需要解决全国省市县数据的问题。作者为了方便读者的学习,专门设了一台服务器,用于提供全国所有省市县的数据信息。

        想罗列出中国所有的省份,只需要访问地址:http://guolin.tech/api/china。服务器会返回一段JSON格式的数据,包含中国所有省份名称以及省份id。如果想知道某个省份内有哪些城市,比如江苏的id是16,访问地址:http://guolin.tech/api/china/16。只需要把省份id添加到url地址的最后面即可。比如苏州的id是116,那么想知道苏州下有哪些县和区的时候,访问地址:http://guolin.tech/api/china/16/116。如此类推。但返回苏州下有哪些县和区的时候,会返回相应的weather_id,拿着这个id再去访问和风天气的接口,就可以获取到该地区具体的天气信息了。

        和风天气的接口,使用方法也很简单。首先注册自己的账号,注册地址是http://guolin.tech/api/weather/register。注册好了之后,就能看到自己的APIKey,以及每天剩余的访问次数。有了APIKey,再配合weather_id,我们就可以获取到任意城市的天气信息。比如说苏州的weather_id是CN101190401,那么访问如下接口即可查看苏州的天气信息:

    http://guolin.tech/api/weather?cityid=CN101190401&key=bc0418b57b2d4918819d3974ac1285d9。

       其中,cityid部分填入的是待查看城市的weather_id,key部分就是注册的APIKey。这样服务器就会把苏州详细的天气信息以JSON格式返回给我们。由于返回数据较复杂,精简处理后,如下所示:

     1  2     “HeWeather":[
     3     {
     4         "status":"ok",
     5         "basic":{},
     6         "api":{},
     7         "now"{},
     8         "suggestion":{}
     9         "daily_forecast":[]
    10         }
    11     ]
    12 }

        返回数据的格式大体上就是这样,其中status代表请求状态,ok表示成功。basic中会包含城市的一些基本信息,api中会包含当前空气质量的情况,now中会包含当前的天气信息,suggestion中会包含一些天气相关的生活建议,daily_forecast中会包含未来几天的天气信息。

        数据都能获取到了之后,接下来就是JSON解析的工作了。

    (二)创建数据库和表

        在Android Srudio中新建一个Android项目,项目名叫作CoolWeather,包名叫作com.coolweather.android。在com.coolweather.android包下再新建几个包,db包用于存放数据库模型相关代码,gson包用于存放GSON模型相关代码,service包用于存放服务相关的代码,util包用于存放工具相关的代码。

        为了简化数据库的操作,这里使用LitePal来管理酷欧天气的数据库。

        先将项目需要的各种依赖库进行声明,编辑app/build.gradle文件,在dependencies闭包中添加如下内容:

    1 dependencies{
    2     compile fileTree(dir:'libs',include:['*.jar'])
    3     compile 'com.android.support:appcompat-v7:24.2.1'
    4     testCompile 'junit:junit:4.12'
    5     compile 'org.litepal.android:core:1.3.2'
    6     compile 'com.squareup.okhttp3:okhttp:3.4.1'
    7     compile 'com.google.code.gson:gson:2.7'
    8     compile 'com.github.bumptech.glide:glide:3.7.0'
    9 }

        LitePal用于对数据库进行操作,OkHttp用于进行网络,GSON用于解析JSON数据,Glide用于加载和展示图片。

        然后我们来设计一下数据库的表结构。这里准备建立3张表:province、city、county,分别用于存放省、市、县的数据信息。对应到实体类中的话,就应该建立Province、City、County这3个类。

        在db包下新建Province类,代码如下:

     1 public class Province extends DataSupport {
     2 
     3     private int id;
     4 
     5     private String provinceName;
     6 
     7     private int provinceCode;
     8 
     9     public int getId() {
    10         return id;
    11     }
    12 
    13     public void setId(int id) {
    14         this.id = id;
    15     }
    16 
    17     public String getProvinceName() {
    18         return provinceName;
    19     }
    20 
    21     public void setProvinceName(String provinceName) {
    22         this.provinceName = provinceName;
    23     }
    24 
    25     public int getProvinceCode() {
    26         return provinceCode;
    27     }
    28 
    29     public void setProvinceCode(int provinceCode) {
    30         this.provinceCode = provinceCode;
    31     }
    32 }

        其中,id是每个实体类db都应该有的字段,provinceName记录省的名字,provinceCode记录省的代号。另外、LitePal中的每一个实体类都必须要继承自DataSupport类的。

        接着在db包下新建一个City类,代码如下:

    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;
        }
    
    }

        其中,cityName记录市的名字,cityCode记录市的代号,provinceId记录当前市所属省的id值。

        然后在db包下新建一个County类,代码如下:

     1 public class County extends DataSupport {
     2 
     3     private int id;
     4 
     5     private String countyName;
     6 
     7     private String weatherId;
     8 
     9     private int cityId;
    10 
    11     public int getId() {
    12         return id;
    13     }
    14 
    15     public void setId(int id) {
    16         this.id = id;
    17     }
    18 
    19     public String getCountyName() {
    20         return countyName;
    21     }
    22 
    23     public void setCountyName(String countyName) {
    24         this.countyName = countyName;
    25     }
    26 
    27     public String getWeatherId() {
    28         return weatherId;
    29     }
    30 
    31     public void setWeatherId(String weatherId) {
    32         this.weatherId = weatherId;
    33     }
    34 
    35     public int getCityId() {
    36         return cityId;
    37     }
    38 
    39     public void setCityId(int cityId) {
    40         this.cityId = cityId;
    41     }
    42 
    43 }

        其中,countyName记录县的名字,weatherId记录县所对应的天气id,cityId记录当前县所属市的id值。

        接下来需要配置litepalxml文件。右击app/src/main目录-New-Directory,创建一个assets目录,然后在assets目录下再新建一个litepal.xml文件,接着编辑litepal.xml文件,接着编辑litepal.xml文件中的内容,如下所示:

    1 <litepal>
    2      <dbname value="cool_weather"/>
    3      <version value="1"/> 
    4      <list> 
    5         <mapping class="com.coolweather.android.db.Province"/> 
    6         <mapping class="com.coolweather.android.db.City"/>        
    7         <mapping class="com.coolweather.android.db.County"/> 
    8       </list>
    9 </litepal>

        我们将数据库名指定为cool_weather ,数据库版本指定成1,并将Province、City、和County这3个实体类添加到映射列表当中。

        最后再配置一下LitePalApplication,修改AndroidManifest.xml中的代码,如下所示:

     1 <manifest package="com.coolweather.android"   
     2     xmlns:android="http://schemas.android.com/apk/res/android">
     3     <application 
     4         android:name="org.litepal.LitePalApplication"  
     5         android:theme="@style/AppTheme"  
     6         android:supportsRtl="true" 
     7         android:label="@string/app_name"
     8         android:icon="@mipmap/logo"       
     9         android:allowBackup="true">
    10         
    11     .....
    12   
    13     </application>
    14 </manifest>

        这样我们就将所有的配置都完成了,数据库和表会在首次执行任意数据库操作的时候自动创建。

        下一章节开发遍历省市县数据的功能。

    具体实现步骤连接:

    android开发学习之路——天气预报之技术分析与数据库(一)

    android开发学习之路——天气预报之遍历省市县数据(二)

    android开发学习之路——天气预报之显示天气信息(三)

    android开发学习之路——天气预报之手动更新天气和切换城市(四)

    android开发学习之路——天气预报之后台自动更新天气(五)

  • 相关阅读:
    在线报表设计实战系列 – 制作动态列与静态列混排的报表(5)
    在线报表设计实战系列 – 制作复杂表头报表(4)
    在线报表设计实战系列 – 制作交叉分析表(3)
    在线报表设计实战系列 – 制作表格类报表(2)
    在线报表设计实战系列 – 准备数据源(1)
    ActiveReports 报表控件V12新特性 -- RPX报表转换为RDL报表
    ActiveReports 报表控件V12新特性 -- 新增矩表的RepeatToFill属性
    HDU 2199 Can you solve this equation?_二分搜索
    POJ 1606 jugs(又是水壶问题)
    POJ 3414 Pots
  • 原文地址:https://www.cnblogs.com/weilongfu/p/7403059.html
Copyright © 2011-2022 走看看