LitepalNewDemo【開源數據庫ORM框架-LitePal2.0.0版本的使用】

版權聲明:本文爲HaiyuKing原創文章,轉載請註明出處!html

前言

本Demo使用的是LitePal2.0.0版本,對於舊項目如何升級到2.0.0版本,請閱讀《趕快使用LitePal 2.0版本吧》,總結起來有三點:java

一、若是你是在繼承結構中使用了DataSupport,那麼就將它改成LitePalSupport;android

二、若是你是調用了DataSupport中的靜態方法,那麼就將它改成LitePal;git

三、若是你的項目代碼啓用了混淆,那麼混淆的配置也須要進行相應的修改,將混淆文件中的DataSupport改爲LitePalSupport。github

 

===============2018/10/12更新====================sql

參考《新版LitePal發佈,一次難以想象的升級數據庫

目前新版本是3.0.0,相較於2.0.0版本,結構上有了質的變化,可是在功能的基本使用上同樣。須要注意如下幾點:安全

一、LitePal如今再也不只是一個庫了,而是變成了兩個庫,根據你使用的語言不一樣,須要引入的庫也不一樣。app

若是你使用的是Java,那麼就在build.gradle中引入以下配置:框架

implementation 'org.litepal.android:java:3.0.0'

而若是你使用的是Kotlin,那麼就在build.gradle中引入以下配置:

implementation 'org.litepal.android:kotlin:3.0.0'

二、泛型的優化

在異步查詢的onFinish()回調中,咱們直接獲得的並非查詢的對象,而是一個泛型T對象,還須要再通過一次強制轉型才能獲得真正想要查詢的對象。

3.0.0版本中在FindCallback接口上聲明瞭泛型類型爲Song,那麼在onFinish()方法回調中的參數就能夠直接指定爲Song類型了,從而避免了一次強制類型轉換。

三、增長監聽數據庫的建立和升級功能

LitePal.registerDatabaseListener(new DatabaseListener() {
    @Override
    public void onCreate() {
    }

    @Override
    public void onUpgrade(int oldVersion, int newVersion) {
    }
});

須要注意的是,registerDatabaseListener()方法必定要確保在任何其餘數據庫操做以前調用(好比SQLiteDatabase db = LitePal.getDatabase();,而後當數據庫建立的時候,onCreate()方法就會獲得回調,當數據庫升級的時候onUpgrade()方法就會獲得回調,而且告訴經過參數告訴你以前的老版本號,以及升級以後的新版本號。

使用步驟

1、項目組織結構圖

注意事項:

一、  導入類文件後須要change包名以及從新import R文件路徑

二、  Values目錄下的文件(strings.xml、dimens.xml、colors.xml等),若是項目中存在,則複製裏面的內容,不要整個覆蓋

2、導入步驟

(1)引入Litepal框架(在APP的bundle.gradle文件中添加標記的代碼,此處建議換成3.0.0版本,寫法參考gitHub地址

apply plugin: 'com.android.application'

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.why.project.litepalnewdemo"
        minSdkVersion 16
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

    //LitePal compile 'org.litepal.android:core:2.0.0'
}

(2)配置litepal.xml(在項目的assets目錄中建立litepal.xml文件,並添加如下代碼(或者複製Demo中的litepal.xml文件到項目中))

注意,修改數據庫名字。

<?xml version="1.0" encoding="utf-8"?>
<litepal>

    <!-- <dbname>用於設定數據庫的名字 -->
    <dbname value="litepalnew" ></dbname>

    <!-- <version>用於設定數據庫的版本號 -->
    <version value="1" ></version>

    <!-- <list>用於設定全部的映射模型 -->
    <list>
        <!-- model類,例子以下: -->
        <!-- <mapping class="com.why.model.ClassName"></mapping> -->
    </list>

    <!-- 在開發階段調試的時候,將數據庫文件存放在SD卡/sdcard/Android/data/<package name>/files/databases目錄下 -->
    <!-- 注意,此功能儘可能只在調試的時候使用,把數據庫文件存放在SD卡真的很不安全。 -->
    <!-- 在litepal-1.3.2上支持,須要添加權限【實現將數據庫保存到默認位置】 -->
    <!--<storage value="external"></storage>-->
    <!-- 在litepal-1.6.0上支持,須要添加權限、申請運行時權限【實現將數據庫保存到SD卡指定位置】 -->
    <!--<storage value="guolin/database" />-->

</litepal>

(3) 配置LitePalApplication

 通常項目中都會自定義一個MyApplication,只須要在原來的基礎上添加標記的代碼便可。

package com.why.project.litepalnewdemo;

import android.app.Application;
import android.database.sqlite.SQLiteDatabase;

import org.litepal.LitePal;

/**
 * Created by HaiyuKing
 * Used
 */

public class MyApplication extends Application{
    @Override
    public void onCreate() {
        super.onCreate();

        /*=================litepal數據庫=====================*/ LitePal.initialize(this); //獲取到SQLiteDatabase的實例,建立數據庫表
        SQLiteDatabase db = LitePal.getDatabase();
    }
}

在AndroidManifest.xml文件中聲明MyApplication

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.why.project.litepalnewdemo">

    <application
        android:name=".MyApplication"
        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>

</manifest>

3、使用方法

注意,本Demo只是記錄LitePal2.0.0版本的簡單使用,其餘相關使用參考《Litepal【開源數據庫ORM框架】》及其參考資料。

(1)建立表

  • 新建bean類並繼承LitePalSupport(擁有了進行CRUD操做的能力)
package com.why.project.litepalnewdemo.bean;

import org.litepal.annotation.Column;
import org.litepal.crud.LitePalSupport;

/**
 * Created by HaiyuKing
 * Used 登陸帳戶信息bean類
 */

public class LoginUserBean extends LitePalSupport{
    @Column(nullable = false)
    private String userName;//不能爲空

    @Column(nullable = false)
    private String passWord;

    @Column(unique = true)
    private String userId;//不可重複

    private String tel;

    public String getPassWord() {
        return passWord;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }
}
  • 將該bean類配置到映射列表(litepal.xml)當中
<?xml version="1.0" encoding="utf-8"?>
<litepal>

    <!-- <dbname>用於設定數據庫的名字 -->
    <dbname value="litepalnew" ></dbname>

    <!-- <version>用於設定數據庫的版本號 -->
    <version value="1" ></version>

    <!-- <list>用於設定全部的映射模型 -->
    <list>
        <!-- model類,例子以下: -->
        <!-- <mapping class="com.why.model.ClassName"></mapping> -->
        <mapping class="com.why.project.litepalnewdemo.bean.LoginUserBean"></mapping>
    </list>

    <!-- 在開發階段調試的時候,將數據庫文件存放在SD卡/sdcard/Android/data/<package name>/files/databases目錄下 -->
    <!-- 注意,此功能儘可能只在調試的時候使用,把數據庫文件存放在SD卡真的很不安全。 -->
    <!-- 在litepal-1.3.2上支持,須要添加權限【實現將數據庫保存到默認位置】 -->
    <!--<storage value="external"></storage>-->
    <!-- 在litepal-1.6.0上支持,須要添加權限、申請運行時權限【實現將數據庫保存到SD卡指定位置】 -->
    <!--<storage value="guolin/database" />-->

</litepal>
  • 執行SQLiteDatabase db = Connector.getDatabase();(只要你對數據庫有任何的操做,news表就會被自動建立出來)

由於寫在MyApplication中了,也就是說APP啓動的時候就執行建立表的操做了。固然了,能夠根據實際需求寫在任何一個位置。

此時運行項目,項目中就會建立數據庫了。

(2)升級表

若是已有的表bean類中新增、減小、修改字段或者新建表的bean類,都須要升級表。

  • 新建bean類並繼承LitePalSupport

  若是升級的是已有表,則添加、刪除、修改已有表的字段。

  • 在映射列表litepal.xml中新增bean類,並將版本號+1【若是升級的是已有表,則只將版本號+1】
<!-- <version>用於設定數據庫的版本號 -->
    <version value="2" ></version>
  • 執行SQLiteDatabase db = Connector.getDatabase();

(3)存儲數據

  • save()【通常用於存儲單條數據】
btn_save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                LoginUserBean loginUserBean = new LoginUserBean(); loginUserBean.setUserId("00001"); loginUserBean.setUserName("用戶名1"); loginUserBean.setPassWord("密碼1"); loginUserBean.setTel("18600001"); loginUserBean.save();
            }
        });
  • saveOrUpdate

處理不存在就存儲,已存在就更新的需求

btn_saveOrUpdate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                LoginUserBean loginUserBean = new LoginUserBean(); loginUserBean.setUserId("00001"); loginUserBean.setUserName("用戶名1_"); loginUserBean.setPassWord("密碼1_"); loginUserBean.setTel("18600001"); loginUserBean.saveOrUpdate("userid=?",loginUserBean.getUserId());
            }
        });
  • saveAll

專門用於存儲集合數據的。

btn_saveAll.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                LoginUserBean loginUserBean2 = new LoginUserBean();
                loginUserBean2.setUserId("00002");
                loginUserBean2.setUserName("用戶名2");
                loginUserBean2.setPassWord("密碼2");
                loginUserBean2.setTel("18600002");

                LoginUserBean loginUserBean3 = new LoginUserBean();
                loginUserBean3.setUserId("00003");
                loginUserBean3.setUserName("用戶名3");
                loginUserBean3.setPassWord("密碼3");
                loginUserBean3.setTel("18600003");

                List<LoginUserBean> loginList = new ArrayList<LoginUserBean>();
                loginList.add(loginUserBean2);
                loginList.add(loginUserBean3);

                LitePal.saveAll(loginList);
            }
        });

(4)修改數據

  • update()

根據主鍵id值(litepal數據庫自動生成的ID值,從1開始)修改數據。

btn_update.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ContentValues values = new ContentValues(); values.put("username","用戶名2_"); int updateNum = LitePal.update(LoginUserBean.class,values,2);//修改id值等於2的那一行數據
                Log.w(TAG,"{btn_update}updateNum="+updateNum);
            }
        });
  • updateAll()

根據某個查詢條件進行修改數據。

btn_updateAll.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ContentValues values = new ContentValues(); values.put("username","用戶名3_"); int updateAllNum = LitePal.updateAll(LoginUserBean.class,values,"userid=?","00003");//修改userid=00003的那一行數據
                Log.w(TAG,"{btn_update}updateAllNum="+updateAllNum);
            }
        });

(5)查詢數據

普通查詢
  • findFirst()

取出表中的第一條數據。

LoginUserBean firstModel = LitePal.findFirst(LoginUserBean.class);
  • findLast()

取出表中的最後一條數據。

LoginUserBean lastModel = LitePal.findLast(LoginUserBean.class);
  • findAll()

查詢全部數據。

                List<LoginUserBean> findAllList = LitePal.findAll(LoginUserBean.class);
                if(findAllList.size() > 0){
                    for(LoginUserBean model : findAllList){
                        Log.w(TAG,"model.getUserId()" + model.getUserId());
                    }
                }
連綴查詢
  • where()
                List<LoginUserBean> findWhereList = LitePal.where("userid=?","00003").find(LoginUserBean.class);
                if(findWhereList.size() > 0){
                    for(LoginUserBean model : findWhereList){
                        Log.w(TAG,"model.getUserId()" + model.getUserId());
                    }
                }
  • select()
                List<LoginUserBean> findSelectList = LitePal.select("userid","username").where("userid=?","00003").find(LoginUserBean.class);
                if(findSelectList.size() > 0){
                    for(LoginUserBean model : findSelectList){
                        Log.w(TAG,"model.getUserId()" + model.getUserId());
                    }
                }
  • order()

order()方法中接收一個字符串參數,用於指定查詢出的結果按照哪一列進行排序,asc表示正序排序,desc表示倒序排序。

                List<LoginUserBean> findOrderList = LitePal.select("userid","username")
                        .where("userid=?","00003")
                        .order("userid desc")
                        .find(LoginUserBean.class);
                if(findOrderList.size() > 0){
                    for(LoginUserBean model : findOrderList){
                        Log.w(TAG,"model.getUserId()" + model.getUserId());
                    }
                }
  • limit()

這個方法接收一個整型參數,用於指定查詢前幾條數據。

                List<LoginUserBean> findlimitList = LitePal.select("userid","username")
                        .where("userid=?","00003")
                        .limit(10)
                        .find(LoginUserBean.class);
                if(findlimitList.size() > 0){
                    for(LoginUserBean model : findlimitList){
                        Log.w(TAG,"model.getUserId()" + model.getUserId());
                    }
                }
  • offset()

用於指定查詢結果的偏移量。

List<LoginUserBean> findoffsetList = LitePal.select("userid","username")
                        .where("userid=?","00003")
                        .limit(10)
                        .offset(10)
                        .find(LoginUserBean.class);
                if(findoffsetList.size() > 0){
                    for(LoginUserBean model : findoffsetList){
                        Log.w(TAG,"model.getUserId()" + model.getUserId());
                    }
                }
  • findFirst()【連綴查詢中查詢結果的第一行數據】
                LoginUserBean findWhereFisrt = LitePal.where("userid=?","00003").findFirst(LoginUserBean.class);
                Log.w(TAG,"findWhereFisrt.getUserId()" + findWhereFisrt.getUserId());
  • findLast()【連綴查詢中查詢結果的最後一行數據】
                LoginUserBean findWhereLast = LitePal.where("userid=?","00003").findLast(LoginUserBean.class);
                Log.w(TAG,"findWhereFisrt.getUserId()" + findWhereLast.getUserId());
  • isExist()
                boolean isExist = LitePal.isExist(LoginUserBean.class,"userid=?","00003");
                Log.w(TAG,"isExist=" + isExist);

(6)刪除數據

  • delete()

須要注意的是,這不只僅會將news表中的記錄刪除,同時還會將其它表中以這條記錄做爲外鍵的數據一塊兒刪除掉,由於外鍵既然不存在了,那麼這麼數據也就沒有保留的意義了。

                int DelNum = LitePal.delete(LoginUserBean.class,1);//刪除ID值等於1的那一行數據
                Log.w(TAG,"DelNum=" + DelNum);
  • deleteAll()
                int delAllNum = LitePal.deleteAll(LoginUserBean.class,"userid=?","00002");
                Log.w(TAG,"delAllNum=" + delAllNum);

 

在不指定約束條件的狀況下,deleteAll()方法就會刪除表中全部的數據了。

                int delAllNum = LitePal.deleteAll(LoginUserModel.class);
                Log.w(TAG,"delAllNum=" + delAllNum);

混淆配置

#=====================litpal框架混淆=====================
-keep class org.litepal.** {
    *;
}
-keep class * extends org.litepal.crud.DataSupport {
    *;
}
-keep class * extends org.litepal.crud.LitePalSupport {
    *;
}

參考資料

Litepal【開源數據庫ORM框架】

趕快使用LitePal 2.0版本吧

gitHub地址

項目demo下載地址

https://github.com/haiyuKing/LitepalNewDemo

相關文章
相關標籤/搜索