LitePal是一款开源的Android数据库框架,采用对象关系映射(ORM)模式,将常用的数据库功能进行封装,可以不用写一行SQL语句就可以完成创建表、增删改查的操作。并且很轻量级,jar包不到100k,几乎零配置。
根据LitePal的数据类型支持,可以进行对象关系映射的数据类型一共有8种,int、short、long、float、double、boolean、String、Date。只要是声明成这8种数据类型的字段都会被自动映射到数据库表中,并不需要进行任何额外的配置。
使用步骤:
1、添加远程依赖:
implementation 'org.litepal.android:core:1.5.1'
2、在app目录下创建assets文件夹,并创建litepal.xml文件。
其中litepal.xml的内容为:(这个文件主要是用来配置数据库以及相关的映射模型)
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<!--数据库名-->
<dbname value="BookStore"></dbname>
<!--数据库版本号,如果修改model类了,可以修改版本号,这样,之前数据库中的数据也能得到保存-->
<version value="1"></version>
<!--映射模型,注意一定要使用完整的类名-->
<list>
<mapping class="com.deepreality.litepaltestdemo.Book"></mapping>
</list>
</litepal>
注意两点:
第一:每次只要数据库发生变动, 版本号version都必须加1,这样的话,之前的数据也能得到保存;
第二:表的写法是全类名+表名(Book),如果是多张表,就在list标签中写多个mapping标签就ok。
3、需要在清单文件AndroidManifest.xml里添加配置:
android:name="org.litepal.LitePalApplication"
如下:
4、各个类必须继承DataSupport类才能进行CRUD操作,比如:
/**
* 必须继承 DataSupport 类,才能进行 CRUD 操作
*/
public class Book extends DataSupport {
private int id;
private String author;
private double price;
private int pages;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getPages() {
return pages;
}
public void setPages(int pages) {
this.pages = pages;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
配置至此就OK了。下面开始进行增、删、改、查操作。
1、增加操作
Book book = new Book();
book.setAuthor("某某人");
book.setName("第一行代码");
book.setPages(210);
//添加该条数据
book.save();
注意:save()是添加一条数据,批量添加是 DataSupport.saveAll(books);
2、删除操作
2.1、清空Book表所有数据:
//清空数据
DataSupport.deleteAll(Book.class);
2.2、删除某一条数据
//删除某一条数据
DataSupport.deleteAll(Book.class, "author = ? and pages < ?", "某某人", "200");
3、修改操作
//修改一条数据
//把author=某某人,并且pages=200的数据的price改为25
Book book = new Book();
book.setPrice(25);
book.updateAll("author = ? and pages < ?", "某某人", "200");
//如果知道id的话,可以用下面的(比如,id是1)
//book.update(1);
注意事项:如果更新price为0,直接book.setPrice(0)是无效的。因为在Java中Int的默认值是0,所以LitePal将不会对此进行更新。可以使用book.setToDefault("price")即可,传入相应的字段名。
4、查询操作
//查询操作
//查询一条数据,知道id
//Book book = DataSupport.find(Book.class, 1);
//查询第一条数据
//Book book = DataSupport.findFirst(Book.class);
//查询最后一条数据
//Book book = DataSupport.findLast(Book.class);
//查询数据集合
//知道id的情况下
/*long[] ids = new long[] { 1, 3, 5, 7 };
List<Book> bookList = DataSupport.findAll(Book.class, ids);*/
//不知道id的情况下
//聚合查询
//select:选择哪几列显示;limit:选择前几个数据;offset:偏移量,用于翻页时数据获取。
List<Book> bookList = DataSupport.select("name", "author")
.where("pages > ?", "100")
.order("price desc").limit(10).offset(10)
.find(Book.class);
模糊搜索:
userList = DataSupport.select("id", "name", "sex", "age", "school") .where("name like ?", "%" + name + "%") .find(Tb_User.class);
至此,LitePal的增、删、改、查基本用法介绍完毕。
使用LitePal的聚合函数
LitePal中一共提供了count()、sum()、average()、max()和min()这五种聚合函数,基本上已经将SQL语句当中最常用的几种聚合函数都覆盖了,那么下面我们就来对这五种聚合函数的用法一一进行学习。
count()
count()方法主要是用于统计行数的,刚才演示了如何通过SQL语句来统计news表中一共有多少行,那么下面我们来看一下如何通过LitePal来实现同样的功能,代码如下所示:
int result = DataSupport.count(News.class);
你没有看错!就是这样一行代码就可以了。调用DataSupport类当中的count()方法,count()方法接收一个Class参数,用于指定去统计哪张表当中的数据,然后返回值是一个整型数据,也就是统计出的结果了。
除此之外,LitePal中所有的聚合函数都是支持连缀的,也就是说我们可以在统计的时候加入条件语句。比如说想要统计一共有多少条新闻是零评论的,就可以这样写:
int result = DataSupport.where("commentcount = ?", "0").count(News.class);
这个用法和我们在上一篇文章当中学到的连缀查询是比较像的,在DataSupport类中首先指定一个where语句用于条件约束,然后连缀一个count()方法,这样统计出的就是满足条件语句的结果了。连缀不仅适用于count()方法,也同样适用于下面我们将要介绍的所有方法,但由于用法都是相同的,后面就不再重复介绍了。
sum()
看完了count()方法应该是觉得非常简单吧,剩下的几个聚合函数也是同样简单的,我们继续来学习一下。
sum()方法主要是用于对结果进行求合的,比如说我们想要统计news表中评论的总数量,就可以这样写:
int result = DataSupport.sum(News.class, "commentcount", int.class);
sum()方法的参数要稍微多一点,我们来一一看下。第一个参数很简单,还是传入的Class,用于指定去统计哪张表当中的数据。第二个参数是列名,表示我们希望对哪一个列中的数据进行求合。第三个参数用于指定结果的类型,这里我们指定成int型,因此返回结果也是int型。
需要注意的是,sum()方法只能对具有运算能力的列进行求合,比如说整型列或者浮点型列,如果你传入一个字符串类型的列去求合,肯定是得不到任何结果的,这时只会返回一个0作为结果。
average()
average()方法主要是用于统计平均数的,比如说我们想要统计news表中平均每条新闻有多少评论,就可以这样写:
double result = DataSupport.average(News.class, "commentcount");
其中average()方法接收两个参数,第一个参数不用说,仍然是Class。第二个参数用于指定列名的,表示我们想要统计哪一列的平均数。需要注意的是,这里返回值的类型是double型,因为平均数基本上都是会带有小数的,用double类型可以最大程序保留小数位的精度。
同样地,average()方法也只能对具有运算能力的列进行求平均值,如果你传入了一个字符串类型的列,也是无法得到任何结果的,这时同样只会返回一个0作为结果。
max()
max()方法主要用于求出某个列中最大的数值,比如我们想要知道news表中所有新闻里面最高的评论数是多少,就可以这样写:
int result = DataSupport.max(News.class, "commentcount", int.class);
可以看到,max()方法接收三个参数,第一个参数同样还是Class,用于指定去统计哪张表当中的数据。第二个参数是列名,表示我们希望统计哪个列中的最大值。第三个参数用于指定结果的类型,根据实际情况来选择传入哪种类型就行了。
那么不用多说,max()方法也只能对具有运算能力的列进行求最大值的,希望你在使用的时候能够谨记这一点。
min()
min()方法主要用于求出某个列中最小的数值,比如我们想要知道news表中所有新闻里面最少的评论数是多少,就可以这样写:
int result = DataSupport.min(News.class, "commentcount", int.class);
min()方法和max()方法的用法基本上是一模一样的,参数也是完全相同,只是方法名变了一下。它们一个是求出某一列中的最大值,一个是求出某一列中的最小值,仅此而已。