版权声明:本文为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()方法就会获得回调,而且告诉经过参数告诉你以前的老版本号,以及升级以后的新版本号。
注意事项:
一、 导入类文件后须要change包名以及从新import R文件路径
二、 Values目录下的文件(strings.xml、dimens.xml、colors.xml等),若是项目中存在,则复制里面的内容,不要整个覆盖
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'
}
注意,修改数据库名字。
<?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>
通常项目中都会自定义一个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框架】》及其参考资料。
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; } }
<?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>
由于写在MyApplication中了,也就是说APP启动的时候就执行建立表的操做了。固然了,能够根据实际需求写在任何一个位置。
此时运行项目,项目中就会建立数据库了。
若是已有的表bean类中新增、减小、修改字段或者新建表的bean类,都须要升级表。
若是升级的是已有表,则添加、删除、修改已有表的字段。
<!-- <version>用于设定数据库的版本号 --> <version value="2" ></version>
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(); } });
处理不存在就存储,已存在就更新的需求
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()); } });
专门用于存储集合数据的。
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); } });
根据主键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); } });
根据某个查询条件进行修改数据。
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); } });
取出表中的第一条数据。
LoginUserBean firstModel = LitePal.findFirst(LoginUserBean.class);
取出表中的最后一条数据。
LoginUserBean lastModel = LitePal.findLast(LoginUserBean.class);
查询全部数据。
List<LoginUserBean> findAllList = LitePal.findAll(LoginUserBean.class); if(findAllList.size() > 0){ for(LoginUserBean model : findAllList){ Log.w(TAG,"model.getUserId()" + model.getUserId()); } }
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()); } }
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()方法中接收一个字符串参数,用于指定查询出的结果按照哪一列进行排序,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()); } }
这个方法接收一个整型参数,用于指定查询前几条数据。
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()); } }
用于指定查询结果的偏移量。
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()); } }
LoginUserBean findWhereFisrt = LitePal.where("userid=?","00003").findFirst(LoginUserBean.class); Log.w(TAG,"findWhereFisrt.getUserId()" + findWhereFisrt.getUserId());
LoginUserBean findWhereLast = LitePal.where("userid=?","00003").findLast(LoginUserBean.class); Log.w(TAG,"findWhereFisrt.getUserId()" + findWhereLast.getUserId());
boolean isExist = LitePal.isExist(LoginUserBean.class,"userid=?","00003"); Log.w(TAG,"isExist=" + isExist);
须要注意的是,这不只仅会将news表中的记录删除,同时还会将其它表中以这条记录做为外键的数据一块儿删除掉,由于外键既然不存在了,那么这么数据也就没有保留的意义了。
int DelNum = LitePal.delete(LoginUserBean.class,1);//删除ID值等于1的那一行数据 Log.w(TAG,"DelNum=" + DelNum);
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 {
*;
}