在上一篇文章当中,咱们已经把 LitePal 查询操做的全部用法都学习完了,很显然,LitePal 帮咱们提供了很是强大的查询 API,使得咱们能够极度轻松地完成各类类型的查询。可是呢,在 SQL 语句当中,有一种查询是比较特殊的,就是聚合函数查询,它不像传统查询同样是将表中的某些列的数据查询出来,而是将查询结果进行聚合和统计,最终将统计后的结果进行返回。所以,任何一个关系型数据库中都会提供像 count()、sum() 等聚合函数。git
那么不出你所料,LitePal 当中也是对这些聚合函数都进行了封装,让咱们的操做能够变得更加简单。所以,今天咱们就来学习一下 LitePal 中聚合函数的用法,尚未看过前面一篇文章的朋友建议先去参考 Android 数据库高手秘籍 (七)——体验 LitePal 的查询艺术 。github
LitePal 的项目地址是:github.com/LitePalFram…数据库
虽然说是聚合函数,但它的用法其实和传统的查询仍是差很少的,即仍然使用的是 select 语句。可是在 select 语句当中咱们一般不会再去指定列名,而是将须要统计的列名传入到聚合函数当中,那么执行 select 语句使用的仍是 SQLiteDatabase 中的 rawQuery() 方法。下面咱们来尝试一下,好比说想要统计 news 表中一共有多少行,就能够这样写:markdown
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor c = db.rawQuery("select count(1) from news", null);
if (c != null && c.moveToFirst()) {
Log.d("TAG", "result is " + count);
复制代码
能够看到,在 rawQuery() 方法中咱们指定了一个聚合查询语句,其中 count(1) 就是用于去统计一共有多少行的。固然这里并不必定要用 count(1),使用 count(*) 或者 count(主键) 均可以。而后 rawQuery() 方法返回的是一个 Cursor 对象,咱们从这个 Cursor 当中取出第一行第一列的数据,这也就是统计出的结果了。app
那若是咱们想要统计出 news 表中评论的总数量该怎么写呢?代码以下所示:ide
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor c = db.rawQuery("select sum(commentcount) from news", null);
if (c != null && c.moveToFirst()) {
Log.d("TAG", "result is " + count);
复制代码
咱们发现,代码基本是很是类似的,只不过查询语句当中 count() 函数替换成了 sum() 函数。固然了,sum() 函数要求传入一个指定的列名,表示咱们要汇总这一列的总合,所以这里咱们传入了 commentcount 这一列。函数
其它聚合函数的用法也是相似的,就不一一列举了。由此咱们能够总结出一些结论,聚合函数都是要使用 rawQuery() 方法进行 SQL 查询,而后结果会封装到 Cursor 对象当中,接着咱们再从 Cursor 中将结果取出。虽然说你可能以为上面的用法已经足够简单了,由于总共也就只写了六七行代码,可是你有没有想过更简单的写法,好比说只用一行代码就完成聚合查询操做。你没有看错,就是一行代码,LitePal 让这些都成为了可能,那么下面咱们就来学习一下 LitePal 中聚合函数的用法。oop
LitePal 中一共提供了 count()、sum()、average()、max() 和 min() 这五种聚合函数,基本上已经将 SQL 语句当中最经常使用的几种聚合函数都覆盖了,那么下面咱们就来对这五种聚合函数的用法一一进行学习。post
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() 方法,也一样适用于下面咱们将要介绍的全部方法,但因为用法都是相同的,后面就再也不重复介绍了。
看完了 count() 方法应该是以为很是简单吧,剩下的几个聚合函数也是一样简单的,咱们继续来学习一下。
sum() 方法主要是用于对结果进行求合的,好比说咱们想要统计 news 表中评论的总数量,就能够这样写:
int result = DataSupport.sum(News.class, "commentcount", int.class);
复制代码
sum() 方法的参数要稍微多一点,咱们来一一看下。第一个参数很简单,仍是传入的 Class,用于指定去统计哪张表当中的数据。第二个参数是列名,表示咱们但愿对哪个列中的数据进行求合。第三个参数用于指定结果的类型,这里咱们指定成 int 型,所以返回结果也是 int 型。
须要注意的是,sum() 方法只能对具备运算能力的列进行求合,好比说整型列或者浮点型列,若是你传入一个字符串类型的列去求合,确定是得不到任何结果的,这时只会返回一个 0 做为结果。
average() 方法主要是用于统计平均数的,好比说咱们想要统计 news 表中平均每条新闻有多少评论,就能够这样写:
double result = DataSupport.average(News.class, "commentcount");
复制代码
其中 average() 方法接收两个参数,第一个参数不用说,仍然是 Class。第二个参数用于指定列名的,表示咱们想要统计哪一列的平均数。须要注意的是,这里返回值的类型是 double 型,由于平均数基本上都是会带有小数的,用 double 类型能够最大程序保留小数位的精度。
一样地,average() 方法也只能对具备运算能力的列进行求平均值,若是你传入了一个字符串类型的列,也是没法获得任何结果的,这时一样只会返回一个 0 做为结果。
max() 方法主要用于求出某个列中最大的数值,好比咱们想要知道 news 表中全部新闻里面最高的评论数是多少,就能够这样写:
int result = DataSupport.max(News.class, "commentcount", int.class);
复制代码
能够看到,max() 方法接收三个参数,第一个参数一样仍是 Class,用于指定去统计哪张表当中的数据。第二个参数是列名,表示咱们但愿统计哪一个列中的最大值。第三个参数用于指定结果的类型,根据实际状况来选择传入哪一种类型就好了。
那么不用多说,max() 方法也只能对具备运算能力的列进行求最大值的,但愿你在使用的时候可以谨记这一点。
min() 方法主要用于求出某个列中最小的数值,好比咱们想要知道 news 表中全部新闻里面最少的评论数是多少,就能够这样写:
int result = DataSupport.min(News.class, "commentcount", int.class);
复制代码
min() 方法和 max() 方法的用法基本上是如出一辙的,参数也是彻底相同,只是方法名变了一下。它们一个是求出某一列中的最大值,一个是求出某一列中的最小值,仅此而已。
如今咱们已经将 LitePal 中全部聚合函数的用法所有都学习完了,怎么样,是否是感受很是的简单?学完以后相信你们也意识到我在开篇的时候并非在吹牛皮了,确确实实只须要一行代码就能够完成各类聚合查询操做了,上面任何一个统计操做咱们都没有写到第二行代码。
好了,通过八篇文章的学习,咱们已经将 LitePal 中最主要的功能基本都学习完了,相信你从头看到这里,也是经历了一个对 LitePal 零认识,到目前能够熟练使用 LitePal 的一个过程。那么咱们的这个 Android 数据库高手秘籍教程到这里也就要暂停了,这个系列短时间不会再更新,而是等到 LitePal 发布了新版本,有了新功能以后才会对它继续进行讲解。后面我仍然会继续分享更多 Android 技术相关的其它文章,感谢你们对本专栏的持续关注。