開源數據庫 LitePal 學習,強大好使的 CRUD

LitePal 簡介

LitePal 是一款開源的 Android 數據庫框架,它採用了對象關係映射(ORM)的模式,將咱們平時使用的一些數據庫(好比 Sqlite)功能進行了封裝。javascript

配置

第一步php

和咱們平時使用開源庫同樣,在項目的 build.gradle 文件下的 dependencies 閉包中添加依賴:java

compile 'org.litepal.android:core:1.4.1'複製代碼

第二步android

須要配置 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>複製代碼

說明:這裏的 標籤用於指定數據庫名, 標籤用於指定數據庫版本號, 標籤用於指定全部的映射模型。 數據庫

第三步閉包

配置 LitePalApplicationapp

<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 查看結果以下:

Android Device Monitor

可見咱們的數據庫確實建立成功了,接下來咱們查看錶是否建立成功,點擊上圖中的導出圖標

從手機導出文件
,而後利用 SQLite 打開數據庫(也能夠經過命令行方式查看),以下圖:

AndDev表

這就證實咱們的數據庫和表都建立成功了。

升級

就在咱們剛剛建立的 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");複製代碼

運行結果:

updateAll

能夠看到,將 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 = ?", "北京");複製代碼

結果:

deleteAll

能夠看到,刪除了 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());
                }複製代碼

運行查看結果以下:

finaAll

能夠看到,表中的全部數據都已查到,這個方法使用起來方便多了。固然了,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面試專輯


code小生公衆號,天天干貨好技術推送
相關文章
相關標籤/搜索