標籤:android 天氣 litepal sqlite model
謝謝大家對該系列博文的支援與關注,我們現在趁熱打鐵正式開始我們的Android天氣軟體的開發吧!沒有閱讀過之前關於該軟體的功能需求的同學可以先看一下 一起來開發Android的天氣軟體(一),可以先去快速探索一下,清楚我們的概要體系。今天我們要做的是搭建Sqlite資料庫,那這個資料庫要儲存哪些資訊呢!該資料庫是用來儲存全國的省市縣的一些資訊,全國共有34個省比如浙江旗下又有好多的市如杭州、溫州、湖州,杭州下面又有很多區縣,我們要做的就是把這些結構化的資料存放區到我們的資料庫中。
那麼我們現在就開始吧!我們這次使用的是LitePal的開源架構,它採用了對象關係映射(ORM)的模式,並將我們平時開發時最常用到的一些資料庫功能進行了封裝,使得不用編寫一行SQL語句就可以完成各種建表、増刪改查的操作。用起來總之非常的方便,從郭霖大神的博文中學會瞭解該架構後,我就快速學以致用用到這個天氣軟體的編程中來,Pratiece makes preferct,我們下面就來見識下LitePal的威力!
首先我們先要建立Province,City,County三張表。
1、Province
2、City
3、County
好的,以上這是我們表的結構的廬山真面目,我們會發現每一張表都會有一個id,然後會有相應的province_code,province_name屬性,除此之外呢,city還有一個province_id列,這是一個外鍵列,是為了實現省份表與城市表的一個關聯關係,一個city表裡面存放一個具體的省份id,並且允許多個城市都存放同一個省份id,這樣一個城市就只能對應一個省份,但一個省份卻可以有多個城市,也就實現多對一的關係了!以此類推,county也有一個city_id來實現市與縣的一對多的關係,不知道大家看到這裡都理清楚了沒有我們三張表的關係呢!
我們知道了以上的表結構,我們可以正式進入建表操作了,這邊我在重新簡述一下使用LitePal的使用流程,如果還沒有下載這個Jar包的同學,LitePal開源項目地址:https://github.com/LitePalFramework/LitePal下載一下,首先在自己的程式匯入Jar包,在在該項目的assets目錄下面建立一個litepal.xml檔案,第三步再在AndroidManifest.xml中配置一下LitePalApplication了,三步就完成了該包的匯入處理程序!
使用LitePal後呢,我們就不用"create table province (" + "id integer primary key autoincrement, " + "province_name varchar, " + "province_code varchar " )";這樣的建表語句了,一切變得很簡單。根據對象關係映射模式的理念,每一張表都應該對應一個模型(Model),也就是說,如果我們需要先建一張Provinces表,就應該有一個對應的Province模型類。需要什麼表建立一個相應的類,裡頭有什麼列就在模型類裡對應怎樣的欄位,讓我們看一下!Provinces類!
package com.melhc.model;import java.util.ArrayList;import java.util.List;import org.litepal.crud.DataSupport;public class Province extends DataSupport {private int id;private String province_name;private String province_code;private List<City> cities = new ArrayList<City>();public String getProvince_code() {return province_code;}public void setProvince_code(String province_code) {this.province_code = province_code;}public List<City> getCities() {return cities;}public void setCities(List<City> cities) {this.cities = cities;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getProvince_name() {return province_name;}public void setProvince_name(String province_name) {this.province_name = province_name;}}
以上就是我們的Provinces類,我們可以看到該模型類中有id,province_name,provice_code以及cities欄位,並且都實現了其中的get set方法,這邊要注意一定要實現getset方法的,要不然建表會失敗的!此外,id屬性可寫可不寫,LitePal都會和人性化的自動產生的,重點在我們這邊有一個CITY的集合,這個是幹什麼的呢,就是用來描述一個province對應著多個city,所以建立了一個list集合,那麼在city表又怎麼表示多對一的關係呢!
package com.melhc.model;import java.util.ArrayList;import java.util.List;import org.litepal.crud.DataSupport;public class City extends DataSupport {private int id;private String city_name;private String city_code;private Province province;private List<County> counties = new ArrayList<County>();public List<County> getCounties() {return counties;}public void setCounties(List<County> counties) {this.counties = counties;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getCity_name() {return city_name;}public void setCity_name(String city_name) {this.city_name = city_name;}public String getCity_code() {return city_code;}public void setCity_code(String city_code) {this.city_code = city_code;}public Province getProvince() {return province;}public void setProvince(Province province) {this.province = province;}}
從以上看出,我們只要在city表建立一個Province類就好了,表示每一個city都對應著一個Province歸屬,好的說到這裡大家都應該明白怎麼實現了吧!
細心的朋友還會發現我們每一個類還繼承了一個DateSupport,這個類是為了實現LitePal資料庫的增刪改查操作的哈!
同上County表如下就好了!
package com.melhc.model;import org.litepal.crud.DataSupport;public class County extends DataSupport {private int id;private String county_name;private String county_code;private City city;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getCounty_name() {return county_name;}public void setCounty_name(String county_name) {this.county_name = county_name;}public String getCounty_code() {return county_code;}public void setCounty_code(String county_code) {this.county_code = county_code;}public City getCity() {return city;}public void setCity(City city) {this.city = city;}} 好的,通過以上操作我們就完成了三張表的建立,別忘了一件事在assets檔案的litepal.xml檔案修改
<?xml version="1.0" encoding="utf-8"?><litepal> <dbname value="weather" > </dbname> <version value="2" > </version> <list> <mapping class="com.melhc.model.Province" > </mapping> <mapping class="com.melhc.model.City" > </mapping> <mapping class="com.melhc.model.County" > </mapping> </list></litepal>
OK,下面為了方便我們的資料庫操作,我們在封裝一個 WeatherDB類,實現對資料庫的正式產生和增刪改查操作!
/** * 將provice執行個體儲存到資料庫 */public void saveProvice(Province province) {if (province != null) {province.save();}}
我們可以看到在儲存province的資訊時,該方法只要傳入一個province類,然後調用province.save方法就可以實現資料庫的插入,那麼怎麼插入資料庫這些欄位的呢,我們只要先建立一個province類,然後再把網路讀取的資訊通過province.setProvice_name()等set方法傳入即可了,是不是非常簡單呢!Province province = new Province();province.setProvince_code(array[0]); province.setProvince_name(array[1]);
那麼下面問題又來了我們怎麼實現city與Province的表與表之間的關聯關係呢,其實也非常簡單,只要將city對應的province得到,並用set方法構造進入就好了!我們來看一下
City city = new City();city.setCity_code(array[0]);city.setCity_name(array[1]);city.setProvince(province);weatherDB.saveCity(city);
是不是非常簡單呢!那麼如何讀取呢,這個就更簡單了,建立一個Province類的list集合,調用DateSupport的findAll()方法即可得到,查詢的方式還有很多,我這邊就不一一列舉了,你還可以增加很多查詢的刪選條件等等。
/** * 從資料庫讀取全國所有的省份資訊 */public List<Province> loadProvices() {List<Province> list = DataSupport.findAll(Province.class);return list;} 那麼如何查詢city表的資料呢?我們知道每一個城市都對應著一個省province,那麼我們先通過與之關聯的province_id找到它對應的province類,問題就解決一大半了,然後再通過這個province類的getCities()方法即可返回該省下面的所有城市列表!
/** * 從資料庫讀取某省下的所有的城市資訊 */public List<City> loadCities(int provinceId) {Province provice = DataSupport.find(Province.class, provinceId,true);List<City> list = provice.getCities();return list;} 好的關鍵點都解釋完了,我們來看一下這個類的全貌吧!
package com.melhc.db;import java.util.List;import org.litepal.crud.DataSupport;import org.litepal.tablemanager.Connector;import com.melhc.model.City;import com.melhc.model.County;import com.melhc.model.Province;import android.database.sqlite.SQLiteDatabase;public class WeatherDB {/** * 一些基本的資料庫方法封裝 */private SQLiteDatabase db;private static WeatherDB weatherDB;public WeatherDB() {// TODO Auto-generated constructor stubdb = Connector.getDatabase();//正式產生資料庫}public synchronized static WeatherDB getInstance() {if (weatherDB == null) {weatherDB = new WeatherDB();}return weatherDB;}/** * 將provice執行個體儲存到資料庫 */public void saveProvice(Province province) {if (province != null) {province.save();}}/** * 從資料庫讀取全國所有的省份資訊 */public List<Province> loadProvices() {List<Province> list = DataSupport.findAll(Province.class);return list;}/** * 將city執行個體儲存到資料庫 */public void saveCity(City city) {if (city != null) {city.save();}}/** * 從資料庫讀取某省下的所有的城市資訊 */public List<City> loadCities(int provinceId) {Province provice = DataSupport.find(Province.class, provinceId,true);List<City> list = provice.getCities();return list;}/** * 將county執行個體儲存到資料庫 */public void saveCounty(County county) {if (county != null) {county.save();}}/** * 從資料庫讀取某城市下的所有的縣資訊 */public List<County> loadCounties(int cityId) {City city = DataSupport.find(City.class, cityId,true);List<County> list = city.getCounties();return list;}/** * 關閉資料庫 */public void destroyDB() {if (db != null) {db.close();}}}
好的,這一節課的內容就講到這裡,第一次博文碼那麼多字,感覺萌萌噠啊,希望大家通過這篇博文能對LitePaL架構有一個更好的認識,也希望大家能繼續支援該系列的博文,你們的支援是我寫下去的最大動力!今天的資料庫設計就到此結束,下一篇博文也會很快跟大家見面的。
下面是該應用的Git開源地址,https://github.com/melhc/SimpleWeather
一起來開發Android的天氣軟體(二)