LitePal 簡介
LitePal 是一款開源的 Android 資料庫框架,它採用了物件關係對映(ORM)的模式,將我們平時使用的一些資料庫(比如 Sqlite)功能進行了封裝。
配置
第一步
和我們平時使用開源庫一樣,在專案的 build.gradle 檔案下的 dependencies 閉包中新增依賴:
compile 'org.litepal.android:core:1.4.1'複製程式碼
第二步
需要配置 litepal.xml 檔案,在 app/src/main 目錄右鍵 ->
New ->
Directory , 建立一個 assets 目錄,在該目錄下新建一個 litepal.xml 檔案,編輯內容如下:
<
?xml version="1.0" encoding="utf-8" ?>
<
litepal>
<
dbname value="AndroidDevelop">
<
/dbname>
<
version value="1">
<
/version>
<
list>
<
/list>
<
/litepal>
複製程式碼
說明:這裡的 標籤用於指定所有的對映模型。
第三步
配置 LitePalApplication
<
application android:name="org.litepal.LitePalApplication" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme">
<
activity android:name=".MainActivity">
<
intent-filter>
<
action android:name="android.intent.action.MAIN" />
<
category android:name="android.intent.category.LAUNCHER" />
<
/intent-filter>
<
/activity>
<
/application>
複製程式碼
驗證、建立以及升級資料庫
經過上面的步驟已經將 LitePal 配置完成,那麼現在就通過建立表來驗證一下。
驗證和建立
新建一個 AndDev 類:
package com.example.mu_16jj.litepaldemo.bean;
/*** Description:AndDev其實就是一張表* <
p>
* WeChat:mu-16jj* <
p>
* Created by mu-16jj on 2017/3/29.*/public class AndDev {
private String name;
private int age;
private String sex;
private int workedTime;
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;
} public int getWorkedTime() {
return workedTime;
} public void setWorkedTime(int workedTime) {
this.workedTime = workedTime;
}
}複製程式碼
說明:大家肯定都很熟悉,這就是一個 JavaBean ,定義了幾個屬性,也就是我們的表 AndDev 中有這些欄位。
建好了表之後,接下來還需要將它新增到我們的模型列表中:
<
?xml version="1.0" encoding="utf-8" ?>
<
litepal>
<
dbname value="AndroidDevelop">
<
/dbname>
<
version value="1">
<
/version>
<
list>
<
mapping class="com.example.mu_16jj.litepaldemo.bean.AndDev">
<
/mapping>
<
/list>
<
/litepal>
複製程式碼
現在我們就可以測試了,啟動一個 Activity ,我這裡只新增了一個按鈕,在其點選事件下寫下面一句程式碼:
LitePal.getDatabase();
複製程式碼
執行程式,點選按鈕,然後開啟 Android Device Monitor 檢視結果如下:
可見我們的資料庫確實建立成功了,接下來我們檢視錶是否建立成功,點選上圖中的匯出圖示
,然後利用 SQLite 開啟資料庫(也可以通過命令列方式檢視),如下圖:
這就證明我們的資料庫和表都建立成功了。
升級
就在我們剛剛建立的 AndDev 表裡面再增加一個 city(城市)列,只需在 AndDev 中新增 city 欄位,設定 getter 和 setter 方法即可(程式碼自己新增);索性我們再新增一張表,名為 Category ,程式碼如下:
package com.example.mu_16jj.litepaldemo.bean;
/** * Description:技術等級表 * <
p>
* WeChat:mu-16jj * <
p>
* Created by mu-16jj on 2017/3/29. */public class Level {
private String primaryLevel;
private String middleLevel;
private String soniorLevel;
public String getPrimaryLevel() {
return primaryLevel;
} public void setPrimaryLevel(String primaryLevel) {
this.primaryLevel = primaryLevel;
} public String getMiddleLevel() {
return middleLevel;
} public void setMiddleLevel(String middleLevel) {
this.middleLevel = middleLevel;
} public String getSoniorLevel() {
return soniorLevel;
} public void setSoniorLevel(String soniorLevel) {
this.soniorLevel = soniorLevel;
}
}複製程式碼
我們還需要做最後一步操作,需要將我們的物件和關係型資料庫建立關係:
說明:可以看到這段程式碼相比之前修改了兩個地方,資料庫版本號修改為 2 ,增加了一個
可以看到,AndDev 表中增加了一個 city 列,level 表也建立成功了。
新增資料
前面已經配置好環境,冰成功建立了兩張表,下面我們就針對這兩張表進行CRUD操作,先來給 AndDev 表新增一組資料,在我們的 Activity 上再新增一個按鈕,其點選事件程式碼如下:
AndDev andDev = new AndDev();
andDev.setAge(25);
andDev.setCity("北京");
andDev.setName("code小生");
andDev.setSex("man");
andDev.setWorkedTime(2);
andDev.save();
複製程式碼
仔細看看上面的程式碼,對於最後一行是不是有些疑惑了,這裡需要說明的是,litepal 對錶的 CRUD 操作依賴一個類 DataSupport ,所以如果我們需要對錶進行操作,那麼這個實體類就需要繼承 DataSupport 類才可以。
執行程式,點選新增按鈕,檢視結果:
可以看到,一組資料成功新增進了我們的 AndDev 表。
更新資料
我們一般的更新就是針對已儲存的物件進行重新設值,那麼,LitePal 是怎麼判斷某個物件是已儲存的呢?當然提供了方法,通過 model.isSaved() 方法返回結果來判斷,true 表示已儲存,false 表示未儲存,那就需要知道一個概念 [ 什麼是已儲存 ]?兩種情況,一種是已經呼叫過 model.save() 方法去新增資料了;另一種是 model 物件是通過 LitePal 查詢 API 查出來的,那麼這兩種情況都會被認為是已儲存的物件。
第一種更新方式
AndDev andDev1 = new AndDev();
andDev1.setWorkedTime(3);
andDev1.setSex("woman");
andDev1.setName("codexiaosheng");
andDev1.setAge(26);
andDev1.setCity("杭州");
andDev1.save();
andDev1.setWorkedTime(5);
andDev1.save();
複製程式碼
執行檢視結果:
可以看到,新的一條資料被成功插入,而且新插入的物件的 workedtime 值並不是 3 ,而是 5,那麼就證明更新確實生效了。但是這種方式太死板,再來看一個比較靈活的方式:
修改更新按鈕事件程式碼如下:
AndDev andDev1 = new AndDev();
andDev1.setCity("甘肅");
andDev1.setWorkedTime(3);
andDev1.updateAll("age = ? and sex = ?", "26", "woman");
複製程式碼
執行結果:
可以看到,將 age = 26 sex = woman 的這條資料的 workedtime 更新為 3 , city 為甘肅。
注意:
如果想把某個欄位的值置為預設,那麼通過物件的 setXXX() 方法是不起作用的(因為根據就不會呼叫),LitePal 提供了更新預設的方法,比如下面的示例:
AndDev andDev2 = new AndDev();
andDev2.setToDefault("age");
andDev2.updateAll();
複製程式碼
執行這段程式碼,就會將所有年齡置為 0 ,updateAll()方法接收一個可變引數變數,不寫預設就對所有列生效。
刪除
我們還是先來看一段程式碼執行後的結果,刪除按鈕監聽程式碼:
DataSupport.deleteAll(AndDev.class, "city = ?", "北京");
複製程式碼
結果:
可以看到,刪除了 city 欄位值為 “北京”的一條資料。deleteAll() 方法和 updateAll() 方法類似,如果不傳引數,預設刪除表中所有資料。
查詢
LitePal 的查詢 API 就更人性化,使用起來挺方便,下面就看例子。在介面新增刪除按鈕,點選事件執行下面程式碼:
List<
AndDev>
andDevs = DataSupport.findAll(AndDev.class);
for (AndDev andDev1 : andDevs) {
Log.e("MainActivity", "age: " + andDev1.getAge());
Log.e("MainActivity", "name: " + andDev1.getName());
Log.e("MainActivity", "sex: " + andDev1.getSex());
Log.e("MainActivity", "workedtime: " + andDev1.getWorkedTime());
Log.e("MainActivity", "city: " + andDev1.getCity());
}複製程式碼
執行檢視結果如下:
可以看到,表中的所有資料都已查到,這個方法使用起來方便多了。當然了,LitePal 還給我們提供了其他的查詢方法,這裡列舉如下:
findFirst(xxx.class);
查詢表中第一條資料;返回一個實體類物件。
findLast(xxx.class);
查詢表中最後一條資料;返回一個實體類物件。
select() 方法用於指定查詢那幾列;返回一個 List 集合;
DataSupport.select("列名1","列名2").find(實體類.class);
複製程式碼
where() 方法用於指定查詢約束條件;返回一個 List 集合;
DataSupport.where("age >
>
", "20").find(實體類.class);
複製程式碼
order() 方法用於指定結果的排序方式;返回一個 List 集合;
DataSupport.order("age desc").find(實體類.class);
複製程式碼
limit() 方法用於指定查詢結果的數量;返回一個 List 集合;比如只查表中前 2 條資料,寫法如下:
DataSupport.limit(3).find(實體類.class);
複製程式碼
offset() 方法用於指定查詢資料的偏移量;返回一個 List 集合;比如查表中第 2 條、第 3 條資料,寫法如下:
DataSupport.limit(2).offset(1).find(實體類.class);
複製程式碼
當然了我們可以將上面的方法組合起來進行復雜查詢:
// 複雜查詢List<
AndDev>
andDevs = DataSupport.select("name", "sex", "age") .where("city = ?", "甘肅") .order("workedTime") .limit(5) .offset(2) .find(AndDev.class);
複製程式碼
這段程式碼表示,查詢 AndDev 表中第 3- 7 條滿足 city 為甘肅這個條件的 name、sex、age 這三列資料,並將查詢結果按照 workedTime 升序排列。
當然了, LitePal 任然支援原生的 SQL 查詢:
Cursor cursor = DataSupport.findBySQL("select * from AndDev where age >
? and workedTime <
2", "22", "2");
複製程式碼
推薦專題《Android開發資源經驗分享》《Android面試專輯》