LitepalNewDemo【開源數據庫ORM框架-LitePal2.0.0版本的使用】
版權聲明:本文為HaiyuKing原創文章,轉載請註明出處!
前言
本Demo使用的是LitePal2.0.0版本,對於舊項目如何升級到2.0.0版本,請閱讀《趕快使用LitePal 2.0版本吧》,總結起來有三點:
1、如果你是在繼承結構中使用了DataSupport,那麽就將它改為LitePalSupport;
2、如果你是調用了DataSupport中的靜態方法,那麽就將它改為LitePal;
3、如果你的項目代碼啟用了混淆,那麽混淆的配置也需要進行相應的修改,將混淆文件中的DataSupport改成LitePalSupport。
使用步驟
一、項目組織結構圖
註意事項:
1、 導入類文件後需要change包名以及重新import R文件路徑
2、 Values目錄下的文件(strings.xml、dimens.xml、colors.xml等),如果項目中存在,則復制裏面的內容,不要整個覆蓋
二、導入步驟
(1)引入Litepal框架(在APP的bundle.gradle文件中添加標記的代碼)
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>
三、使用方法
註意,本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
LitepalNewDemo【開源數據庫ORM框架-LitePal2.0.0版本的使用】