天天看點

開源資料庫 LitePal 學習,強大好使的 CRUD

LitePal 簡介

LitePal 是一款開源的 Android 資料庫架構,它采用了對象關系映射(ORM)的模式,将我們平時使用的一些資料庫(比如 Sqlite)功能進行了封裝。

配置

第一步

和我們平時使用開源庫一樣,在項目的 build.gradle 檔案下的 dependencies 閉包中添加依賴:

第二步

需要配置 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 ,我這裡隻添加了一個按鈕,在其點選事件下寫下面一句代碼:

運作程式,點選按鈕,然後打開 Android Device Monitor 檢視結果如下:

開源資料庫 LitePal 學習,強大好使的 CRUD

可見我們的資料庫确實建立成功了,接下來我們檢視表是否建立成功,點選上圖中的導出圖示

開源資料庫 LitePal 學習,強大好使的 CRUD

,然後利用 SQLite 打開資料庫(也可以通過指令行方式檢視),如下圖:

開源資料庫 LitePal 學習,強大好使的 CRUD

這就證明我們的資料庫和表都建立成功了。

更新

就在我們剛剛建立的 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;
    }

}
           

我們還需要做最後一步操作,需要将我們的對象和關系型資料庫建立關系:

開源資料庫 LitePal 學習,強大好使的 CRUD

說明:可以看到這段代碼相比之前修改了兩個地方,資料庫版本号修改為 2 ,增加了一個 标簽;好了,現在運作程式,點選按鈕,檢視結果:

開源資料庫 LitePal 學習,強大好使的 CRUD
開源資料庫 LitePal 學習,強大好使的 CRUD

可以看到,AndDev 表中增加了一個 city 列,level 表也建立成功了。

添加資料

前面已經配置好環境,冰成功建立了兩張表,下面我們就針對這兩張表進行CRUD操作,先來給 AndDev 表添加一組資料,在我們的 Activity 上再添加一個按鈕,其點選事件代碼如下:

AndDev andDev = new AndDev();
andDev.setAge();
andDev.setCity("北京");
andDev.setName("code小生");
andDev.setSex("man");
andDev.setWorkedTime();
andDev.save();
           

仔細看看上面的代碼,對于最後一行是不是有些疑惑了,這裡需要說明的是,litepal 對表的 CRUD 操作依賴一個類 DataSupport ,是以如果我們需要對表進行操作,那麼這個實體類就需要繼承 DataSupport 類才可以。

運作程式,點選添加按鈕,檢視結果:

開源資料庫 LitePal 學習,強大好使的 CRUD

可以看到,一組資料成功添加進了我們的 AndDev 表。

更新資料

我們一般的更新就是針對已存儲的對象進行重新設值,那麼,LitePal 是怎麼判斷某個對象是已存儲的呢?當然提供了方法,通過 model.isSaved() 方法傳回結果來判斷,true 表示已存儲,false 表示未存儲,那就需要知道一個概念 [ 什麼是已存儲 ]?兩種情況,一種是已經調用過 model.save() 方法去添加資料了;另一種是 model 對象是通過 LitePal 查詢 API 查出來的,那麼這兩種情況都會被認為是已存儲的對象。

第一種更新方式

AndDev andDev1 = new AndDev();
andDev1.setWorkedTime();
andDev1.setSex("woman");
andDev1.setName("codexiaosheng");
andDev1.setAge();
andDev1.setCity("杭州");
andDev1.save();
andDev1.setWorkedTime();
andDev1.save();
           

運作檢視結果:

開源資料庫 LitePal 學習,強大好使的 CRUD

可以看到,新的一條資料被成功插入,而且新插入的對象的 workedtime 值并不是 3 ,而是 5,那麼就證明更新确實生效了。但是這種方式太死闆,再來看一個比較靈活的方式:

修改更新按鈕事件代碼如下:

AndDev andDev1 = new AndDev();
andDev1.setCity("甘肅");
andDev1.setWorkedTime();
andDev1.updateAll("age = ? and sex = ?", "26", "woman");
           

運作結果:

開源資料庫 LitePal 學習,強大好使的 CRUD

可以看到,将 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 = ?", "北京");
           

結果:

開源資料庫 LitePal 學習,強大好使的 CRUD

可以看到,删除了 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 學習,強大好使的 CRUD

可以看到,表中的所有資料都已查到,這個方法使用起來友善多了。當然了,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().find(實體類.class);
           

offset() 方法用于指定查詢資料的偏移量;傳回一個 List 集合;比如查表中第 2 條、第 3 條資料,寫法如下:

DataSupport.limit().offset().find(實體類.class);
           

當然了我們可以将上面的方法組合起來進行複雜查詢:

// 複雜查詢
List<AndDev> andDevs = DataSupport.select("name", "sex", "age")
                .where("city = ?", "甘肅")
                .order("workedTime")
                .limit()
                .offset()
                .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面試專輯》

QQ交流群:481794398

開源資料庫 LitePal 學習,強大好使的 CRUD