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開發學習之路——天氣預報之后台自動更新天氣(五)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM