Android中內建的資料庫有Sqlite,但是平時開發時候如果我們需求的表結構很複雜,這樣一些商務邏輯和版本升級使用Sqlite是不太方便的,通常我們會自己封裝一個架構或者用一些開源的架構來對資料庫進行操作,今天我就介紹一款輕量級的資料庫LitePal,如果你對Sqlite感興趣,可以去這裡下載jar包和源碼。文章出自http://blog.csdn.net/guolin_blog/article/details/38083103,Thank You。下面開始我們今天的講述。 一、sql命令簡單使用
為了方便我們一會兒查看到資訊,可用現在通訊錄中添加一條記錄。
①. 開啟命令列視窗,顯示當前可用裝置: adb devices
②. 進入shell模式:adb shell (註:請使用已Root手機或者模擬器,如果多個裝置串連請用adb -s 裝置名稱 shell ,#代表有Root許可權)
③.接著進入指定目錄:cd data/data/com.android.providers.contacts/databases
④.查看目前的目錄下內容:ll
⑤.開啟資料庫:sqlite3 contacts2.db
⑥.查看錶:.table
⑦.進入line 模式:.mode line(可用對錶結構的顯示起到格式化作用)
⑧.顯示表結構:pragma table_info(accounts); ( pragma table_info(表名) )
⑨.查看錶中資料:select * from data; (基本的sql語句,用於查看data表中的資料 )
sql命令簡單使用就介紹完了最後我們會看到之前我們在通訊錄中添加的那條資料。
二、LitePal的基本用法
LitePal介紹:LitePal是一款開源的Android資料庫架構,它採用了對象關係映射(ORM)的模式,並將我們平時開發時最常用到的一些資料庫功能進行了封裝,使得不用編寫一行SQL語句就可以完成各種建表、増刪改查的操作。並且LitePal很“輕”,jar包只有100k不到,下面我們通過一個簡單的Demo來瞭解LitePal。
①.開啟Android Studio 建立Module(或者用ADT建立一個Android Project)項目目錄結構如下。
②.我們之前說過LitePal是基於對象關係映射的,也就是用物件導向的思想,將對象自動對應到表關係中。首先我們在domain包中建立一個Person類
public class Person { //id欄位可以不用寫 private int id; private String name; private int age; //只要不是private的,都不會自動對應的 protected String sex; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; }}
其中需要注意的有2點:
1. id欄位可以不用寫的,系統會自動添加上。
2. 如果修飾符不是private,則不會自動對應到表中。
③.在src/main/目錄下建立assets目錄,建立litepal.xml設定檔
<?xml version="1.0" encoding="utf-8"?><litepal><dbname value="demo" ></dbname><version value="1" ></version><list><mapping class="com.example.litepaldemo.domain.Person"></mapping></list></litepal>
此設定檔中配置了資料庫的名稱為demo,版本號碼為1,並且將Person實體類映射到表中。
④.我們在MainActivity中調用下面一行代碼就可以建立資料庫了
SQLiteDatabase db = Connector.getDatabase();
最後我們去資料庫看下我們建立好的一張表
至此,LitePal的基本用法已經介紹完畢,接下來我們看一下LitePal的升級(使用Sqlite升級還是比較繁瑣的,如果升級過於頻繁,需要在onUpgrade方法中寫很長switch語句) 三、使用LitePal升級表 ①.添加表
建立Student類如下,然後在litepal.xml中配置如下代碼
public class Student { private String id; private String name; private int age; private String school; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSchool() { return school; } public void setSchool(String school) { this.school = school; }}
<?xml version="1.0" encoding="utf-8"?><litepal> <dbname value="demo" ></dbname> <version value="2" ></version> <list> <mapping class="com.example.litepaldemo.domain.Person"></mapping> <mapping class="com.example.litepaldemo.domain.Student"></mapping> </list></litepal>
我們用命令來查看一下當前資料庫有幾張表
查看person表,我們可以看出來沒有sex列,因為sex列不是private修飾的
②.添加列
我們要在student表中添加一列,首先我們開啟Student類,添加一個private的test欄位,並提供get和set方法
然後更改litepal.xml檔案中version標籤的值為3,重新運行程式,得到如下結果。
③.刪除列
將Student類中test欄位和get和set方法去掉,更改litepal.xml中version標籤的值為4,重新運行程式,得到如下結果。
注意:Sqlite本身不支援刪除列,LitePal刪除列原理是:先將student表重新命名成一個暫存資料表,然後根據最新的Student類的結構產生一個新的student表,再把暫存資料表中除了test之外的資料複製到新的表中,最後把暫存資料表刪掉。
相信上面的講解中,我們可以直觀感覺出使用LitePal處理資料庫的升級問題的便捷之處。
三.使用LitePal建立表關聯 表與表之間的關聯有三種類型:一對一、多對一、和多對多
三種類型對應的實現方式:
一對一關聯的實現方式用外鍵
多對一關聯的實現方式用外鍵
多對多關聯的實現方式用中間表
用物件導向的方式來處理三種關聯類別型:
一對一:在兩個表對應的實體類的任何一方,引用另一個實體類即可。
多對一:用List集合將多的一方封裝起來放在一的實體中,然後在多的實體中引用一的實體。
多對多:在兩個表對應的實體中同時使用List集合引用另一方的實體。
舉一個簡單的列子來說明上述關係,我們在使用新聞類軟體的時候都會發現這樣的現象,每一條新聞都會唯一對應一條簡介,這樣我們就可以吧新聞表(News)和簡介表(Introduction)看成一對一的關係。另外每一條新聞都可以有多條評論,這樣我們就可以吧新聞表(News)和評論表(Comment)看成一對多的關係。還有就是每一條新聞都有可能在不同的分類中被查看到,而且每個分類中都會有多條新聞存在,這樣我們就可以吧新聞表(News)和分類表(Category)看成多對多的關係了。下面我們用代碼來描述這些表之間的關聯。
一對一
①.建立News實體類,自動產生get set方法
private int id;private String title;private String content;private int commentcount;private Date publishdate;private Introduction mIntroduction;
②.建立Introduction實體類,自動產生get set方法
private int id;private String guide;private String digest;private int news_id;
③.編輯assets目錄下litepal.xml檔案,升級版本號碼,引用類
<litepal> <dbname value="demo" ></dbname> <version value="5" ></version> <list> <mapping class="com.example.litepaldemo.domain.Person"></mapping> <mapping class="com.example.litepaldemo.domain.Student"></mapping> <mapping class="com.example.litepaldemo.domain.Introduction"></mapping> <mapping class="com.example.litepaldemo.domain.News"></mapping> </list></litepal>
經過以上三個步驟,完成對錶一對一的關聯,下面我們去查看一下表中是否存在news_id關聯
一對多
①.建立Comment實體類,自動產生get set方法
private int id; private String content; private Date publishdate; private int news_id;
②.在News實體中使用List集合封裝Comment實體,形成一對多的關係,自動產生get set 方法
private int id; private String title; private String content; private int commentcount; private Date publishdate; private Introduction mIntroduction; private List<Comment> commentList = new ArrayList<Comment>();
③.在litepal.xml中升級版本號碼,並引入實體bean
<litepal> <dbname value="demo" ></dbname> <version value="6" ></version> <list> <mapping class="com.example.litepaldemo.domain.Person"></mapping> <mapping class="com.example.litepaldemo.domain.Student"></mapping> <mapping class="com.example.litepaldemo.domain.Introduction"></mapping> <mapping class="com.example.litepaldemo.domain.News"></mapping> <mapping class="com.example.litepaldemo.domain.Comment"></mapping> </list></litepal>
經過以上三個步驟,完成表一對多的關聯,下面我們去查看一下表中是否存在此關聯
多對多
①.建立實體類Category,自動產生get set方法
private int id;private String name;private List<News> newsList = new ArrayList<News>();
②.在News實體類中使用List集合封裝Category,並自動產生get set方法
private int id; private String title; private String content; private int commentcount; private Date publishdate; private Introduction mIntroduction; private List<Comment> commentList = new ArrayList<Comment>(); private List<Category> categoryList = new ArrayList<Category>();
③.修改litepal.xml檔案
<litepal> <dbname value="demo" ></dbname> <version value="7" ></version> <list> <mapping class="com.example.litepaldemo.domain.Person"></mapping> <mapping class="com.example.litepaldemo.domain.Student"></mapping> <mapping class="com.example.litepaldemo.domain.Introduction"></mapping> <mapping class="com.example.litepaldemo.domain.News"></mapping> <mapping class="com.example.litepaldemo.domain.Comment"></mapping> <mapping class="com.example.litepaldemo.domain.Category"></mapping> </list></litepal>
經過以上三個步驟,完成表多對多的關聯,下面我們去查看一下表中是否存在此關聯
以上就是我們如何用LitePal架構處理表間關聯的了。