版权声明:本文为HaiyuKing原创文章,转载请注明出处!

前言

本Demo使用的是LitePal2.0.0版本,对于旧项目如何升级到2.0.0版本,请阅读《赶快使用LitePal 2.0版本吧》,总结起来有三点:

1、如果你是在继承结构中使用了DataSupport,那么就将它改为LitePalSupport;

2、如果你是调用了DataSupport中的静态方法,那么就将它改为LitePal;

3、如果你的项目代码启用了混淆,那么混淆的配置也需要进行相应的修改,将混淆文件中的DataSupport改成LitePalSupport。

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

参考《新版LitePal发布,一次不可思议的升级

目前新版本是3.0.0,相较于2.0.0版本,结构上有了质的变化,但是在功能的基本使用上一样。需要注意以下几点:

1、LitePal现在不再只是一个库了,而是变成了两个库,根据你使用的语言不同,需要引入的库也不同。

如果你使用的是Java,那么就在build.gradle中引入如下配置:

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

而如果你使用的是Kotlin,那么就在build.gradle中引入如下配置:

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

2、泛型的优化

在异步查询的onFinish()回调中,我们直接得到的并不是查询的对象,而是一个泛型T对象,还需要再经过一次强制转型才能得到真正想要查询的对象。

3.0.0版本中在FindCallback接口上声明了泛型类型为Song,那么在onFinish()方法回调中的参数就可以直接指定为Song类型了,从而避免了一次强制类型转换。

3、增加监听数据库的创建和升级功能

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文件路径

2、  Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖

二、导入步骤

(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>

三、使用方法

注意,本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版本的使用】的更多相关文章

  1. .NET 开源SqlServer ORM框架 SqlSugar 3.0 API

    3.1.x ,将作为3.X系统的最后一个版本,下面将会开发 全新的功能 更新列表:https://github.com/sunkaixuan/SqlSugar/releases 优点: SqlSuga ...

  2. Litepal【开源数据库ORM框架】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 好用的数据库框架. 效果图 代码分析 本篇主要是整理Litepal的引入和增删改查的简单操作,具体使用请阅读参考资料. 使用步骤 一 ...

  3. ORM框架--GreenDao 3.0基本使用指南

    0. ORM框架--GreenDao 3.0基本使用指南 1. Gradle 的配置 这里可以参照官方的文档进行最新的配置(本示例的版本等你看到可能就不是最新的了),但是值得注意的一点是,GreenD ...

  4. [Android]Android端ORM框架——RapidORM(v2.0)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5626716.html [Android]Android端ORM ...

  5. .Net开源SqlServer ORM框架SqlSugar整理

    一.链接整理 官方Git源代码地址: https://github.com/sunkaixuan/SqlSugar 最新发布版更新地址:当前版本Release 3.5.2.1 https://gith ...

  6. [开源] .Net orm FreeSql 1.5.0 最新版本(番号:好久不见)

    废话开头 这篇文章是我有史以来编辑最长时间的,历时 4小时!!!原本我可以利用这 4小时编写一堆胶水代码,真心希望善良的您点个赞,谢谢了!! 很久很久没有写文章了,上一次还是在元旦发布 1.0 版本的 ...

  7. [Android]Android端ORM框架——RapidORM(v1.0)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4748077.html  Android上主流的ORM框架有很多 ...

  8. 【转载】Android开源:数据库ORM框架GreenDao学习心得及使用总结

    转载链接:http://www.it165.net/pro/html/201401/9026.html 最近在对开发项目的性能进行优化.由于项目里涉及了大量的缓存处理和数据库运用,需要对数据库进行频繁 ...

  9. .Net开源微型ORM框架测评

    什么是ORM? 对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间 ...

随机推荐

  1. Python简介之输入和输出

    输出 输入 输出 用print()在括号中加上字符串就可以向屏幕上输出指定的文字.比如输出'hello,world!',用代码实现如下:print('hello world!'). print()函数 ...

  2. 简化异常处理的Throwables类

    简化异常处理的Throwables类 有时候, 当我们我们捕获异常, 并且像把这个异常传递到下一个try/catch块中.Guava提供了一个异常处理工具类, 可以简单地捕获和重新抛出多个异常.例如: ...

  3. bzoj 2821 作诗 分块

    基本思路和蒲公英一样 还是预处理出每两个块间的答案 询问时暴力跑两边的贡献 #include<cstdio> #include<cstring> #include<ios ...

  4. 面试阿里前端P6血和泪换来的收获

      我的一个朋友在前端耕耘一段时间,也在网上进行了高度培训学习,最近一段时间他打算跳槽去阿里面试前端P6开发岗位,结果被痛虐了一回,估计从此以后会给他留下不可磨灭的阴影啊 真是十年生死两茫茫,一鲁代码 ...

  5. 大白话5分钟带你走进人工智能-第三节最大似然推导mse损失函数(深度解析最小二乘来源)(1)

                                                    第三节最大似然推导mse损失函数(深度解析最小二乘来源)        在第二节中,我们介绍了高斯分布的 ...

  6. phper的Go之旅(-)--书写前言

    前言:由于我使用的主力机是mac,所以整系列教程都以mac为主,后期可能会更新windows,有时间的话,截止写这篇博客的时间我是一个全职php开发工程师,之所以要写这篇 教程原因就是现在技术语言层出 ...

  7. 从壹开始微服务 [ DDD ] 之十 ║领域驱动【实战篇·中】:命令总线Bus分发(一)

    烽火 哈喽大家好,老张又见面了,这两天被各个平台的“鸡汤贴”差点乱了心神,博客园如此,简书亦如此,还好群里小伙伴及时提醒,路还很长,这些小事儿就随风而去吧,这周本不打算更了,但是被群里小伙伴“催稿”了 ...

  8. Java的多态浅谈

    概述 Java的四大基本特性:抽象,封装,继承和多态.其中,抽象,封装,继承可以说多态的基础,而多态是封装,继承的具体表现.如果非要用专业术语来描述什么是多态的话 多态是指程序中定义的引用变量所指向具 ...

  9. MySQL 复制 - 性能与扩展性的基石 2:部署及其配置

    正所谓理论造航母,现实小帆船.单有理论,不动手实践,学到的知识犹如空中楼阁.接下来,我们一起来看下如何一步步进行 MySQL Replication 的配置. 为 MySQL 服务器配置复制非常简单. ...

  10. javascript深入理解-从作用域链理解闭包

    一.概要 红宝书(P178)对于闭包的定义:闭包就是有权访问另外一个函数作用域中变量的函数. MDN,对于闭包的定义:闭包就是指能够访问自由变量的函数. 那么什么是自由变量?自由变量就是在函数中使用, ...