安卓專案實戰之資料庫框架LitePal的使用詳解
LitePal簡介
LitePal是一款開源的Android資料庫框架,它採用了物件關係對映(ORM)的模式,並將我們平時開發最常用到的一些資料庫功能進行了封裝,使得不用編寫一行SQL語句就可以完成各種建表和增刪改查的操作,並且LitePal很“輕”,jar包大小不到100k,而且近乎零配置,這一點和Hibernate這類的框架有很大區別。目前LitePal的原始碼已經託管到了GitHub上:http://github.com/LitePalFramework/LitePal
LitePal的使用
1.新增依賴 在app/build.gradle檔案中新增compile依賴如下:
dependencies { compile 'org.litepal.android:core:2.0.0' }
其中2.0.0是我使用時當前最新的版本,你們可以自己去GitHub上找最新的版本。
2.在assets目錄下建立litepal.xml配置檔案 專案資料夾下New->Folder->Assets Folder建立相應的assets資料夾,然後在assets資料夾下建立一個名為litepal.xml的檔案,編輯檔案如下:
<?xml version="0.1" encoding="utf-8"?> <litepal> <dbname value="litepaldemo" /> // 資料庫名稱為litepaldemo,預設以 .db 結尾,如未以此結尾,則自動新增。 <version value="1" /> // 資料庫版本為1,每次資料庫發生變動版本號必須+1 <list> // 有幾張表就在list之間寫幾個mapping // list標籤中的實體類都應該繼承DataSupport這個類,這個千萬別忘記 <mapping class="com.gpf.com.User"></mapping> <mapping class="com.gpf.com.Reader"></mapping> <mapping class="com.gpf.com.Movie"></mapping> </list> <storage value="gpf/database" /> //storage 定義資料庫檔案儲存的地方,可選 internal(內部) 和 external(外部), 預設為 internal </litepal>
3.在Application中初始化 在自己的application中加入一行程式碼即可:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// 初始化
LitePal.initialize(this);
}
...
}
經過上面3步的配置,LitePal就已經整合成功並可以正常使用了。
4.實體類建立
/**一定要繼承自DataSupport*/ public class Movie extens DataSupport{ //運用註解來為欄位新增index標籤 //name是唯一的,且預設值為unknown @Column(unique = true, defaultValue = "unknown") private String name; //忽略即是不在資料庫中建立該屬性對應的欄位 @Column(ignore = true) private float price; private byte[] cover; private int duration; //不為空 @Column(nullable = false) private String director; private String type; //記得新增所有欄位的getter和setter方法 }
注意:
- 不管實體類中有沒有id這個屬性,都會預設建立一個為整型的id欄位,作為自增的主鍵
- 如果實體類中有一個欄位名為id,那麼型別只能為int或者long
- id欄位的值始終為當前記錄的行號(下標從1開始),即使我們在實體類中定義了int或者long型別的id欄位,在新增資料時人為的設定id的值為100,等其他值,查詢資料庫發現該id欄位的值設定是無效的,她始終等於該條記錄所在的行id,即第幾條記錄。
- 所有的column註解總共有四個,defaultValue的預設值為空字元,所以這個註解只能用以是String型別的欄位,即字元型才有預設值
- litepal支援的實體類欄位對映型別為 int,long,double,float,byte[],boolean,String,Date;不支援String[]陣列型
資料庫增刪改查操作
1.儲存操作
Movie movie1=new Movie();
movie1.setId(1002);
movie1.setName("東成西就");
movie1.setDirector("劉鎮偉");
movie1.setDuration(100);
movie1.setType("喜劇");
//這一句程式碼就是將一條記錄儲存進資料庫中
movie1.save();
save()方法是有返回值的,返回true代表新增成功,返回flase代表新增失敗。 save()是新增一條資料,批量新增是 DataSupport.saveAll(persons);
2.刪除記錄
//刪除資料庫中movie表的所有記錄
DataSupport.deleteAll(Movie.class);
//刪除資料庫movie表中id為1的記錄
DataSupport.deleteAll(Movie.class,1);
//刪除資料庫movie表中duration大於3500的記錄
DataSupport.deleteAll(Movie.class, "duration > ?" , "3500");
3.修改記錄 方法一:
//第一步,查詢id為1的記錄
Movie movie = DataSupport.find(Movie.class, 1);
//第二步,改變某個欄位的值
movie.setPrice(4020f);
//第三步,儲存資料
movie.save();
方法二:
Movie movie=new Movie();
movie.setName("2Diots");
movie.setDirector("某人");
//直接更新id為1的記錄
movie.update(1);
方法三:
Movie movie=new Movie();
movie.setDirector("someone");
//更新所有name為2Diots的記錄,將director欄位設為someone
movie.updateAll("name = ?", "2Diots");
Movie movie=new Movie();
movie.setName("someone");
movie.setDirector("someone");
//將更新所有name為2Diots,director為gpf的記錄name和director均改為someone
movie.updateAll("name=? and director=?", "2Diots","gpf");
4.查詢記錄
//查詢movie表的所有記錄,返回值是一個泛型為Movie的List集合
List<Movie> allMovies = DataSupport.findAll(Movie.class);
//查詢movie表id為1的記錄
Movie movie = DataSupport.find(Movie.class,1);
//查詢name為2Diots的記錄,並且以時長作排序
List<Movie> movies = DataSupport.where("name = ?", "2Diots").order("duration").find(Movie.class);
//查詢所有年齡小於25歲的人
List<Person> person = DataSupport.where("age < ?", 25).find(Person.class);
使用LitePal來完成升級表的操作:
使用LitePal來建立表之間的關聯關係:
在資料庫中表與表之間的關聯關係一共有三種類型:一對一,一對多,多對多,下面分情況討論:
一對一:
例如新聞表News和簡介表Introducation,一條新聞只能對應一條簡介,同時一條簡介也只能屬於一條新聞。
一對一關係的體現:
在程式語言中:只需要在News類中持有一個Introduction類的引用,然後在Introduction類中也持有一個News類的引用,這樣它們之間自然就是一對一的關係了:
就是這麼簡單,在News類中可以得到一個對應的Introduction的例項,那麼它們之間就是一對一關係了。
在資料庫表中的體現:使用外來鍵,並且外來鍵加在任意哪一張表上都可以。
一對多:
例如新聞表News和評論表Comment,一條新聞可以有多條評論,但是一條評論只能屬於一條新聞。
一對多關係的體現:
在程式語言中:java中有List,Set等集合類來建立物件之間的一對多關係,只需要在一的一方即News類中建立一個集合型別並且泛型是Comment的成員變數即可。
在資料庫表中的提現:也是使用外來鍵,但是外來鍵只能加在多方的表中。
多對多:
例如新聞表News和種類表Category,一條新聞可能屬於不同的種類,同樣的一種種類下也可以有多條新聞。
多對多關係的體現:
在程式語言中:只需要在News類中使用集合類宣告擁有多個Category,然後在Category類中也使用集合類宣告擁有多個News就可以了。
在資料庫表中的體現:多對多關係不能使用外來鍵來表示,必須藉助於中間表,中間表主要用來存放News表和category表之間的關聯關係。
針對以上表和表之間的關聯關係,如果建表的時候使用SQL語句那麼肯定會特別複雜,稍有不慎就有可能會出錯,因此使用LitePal來自動建立表關聯又是一個非常不錯的選擇,我們不需要關心什麼外來鍵,什麼中間表等實現的細節,只需要在實體類中宣告好他們之間的引用關係即可。