程序员人生 网站导航

Android数据库高手秘籍(八)――使用LitePal的聚合函数

栏目:综合技术时间:2014-12-07 09:41:32

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/40614197

在上1篇文章当中,我们已把LitePal查询操作的所有用法都学习完了,很明显,LitePal帮我们提供了非常强大的查询API,使得我们可以极度轻松地完成各种类型的查询。但是呢,在SQL语句当中,有1种查询是比较特殊的,就是聚合函数查询,它不像传统查询1样是将表中的某些列的数据查询出来,而是将查询结果进行聚合和统计,终究将统计后的结果进行返回。因此,任何1个关系型数据库中都会提供像count()、sum()等聚合函数。那末不出你所料,LitePal当中也是对这些聚合函数都进行了封装,让我们的操作可以变得更加简单。因此,今天我们就来学习1下LitePal中聚合函数的用法,还没有看过前面1篇文章的朋友建议先去参考 Android数据库高手秘籍(7)――体验LitePal的查询艺术

LitePal的项目地址是:https://github.com/LitePalFramework/LitePal

传统的聚合函数用法

虽然说是聚合函数,但它的用法其实和传统的查询还是差不多的,即依然使用的是select语句。但是在select语句当中我们通常不会再去指定列名,而是将需要统计的列名传入到聚合函数当中,那末履行select语句使用的还是SQLiteDatabase中的rawQuery()方法。下面我们来尝试1下,比如说想要统计news表中1共有多少行,就能够这样写:

SQLiteDatabase db = dbHelper.getWritableDatabase(); Cursor c = db.rawQuery("select count(1) from news", null); if (c != null && c.moveToFirst()) { int count = c.getInt(0); Log.d("TAG", "result is " + count); } c.close();
可以看到,在rawQuery()方法中我们指定了1个聚合查询语句,其中count(1)就是用于去统计1共有多少行的。固然这里其实不1定要用count(1),使用count(*)或count(主键)都可以。然后rawQuery()方法返回的是1个Cursor对象,我们从这个Cursor当中取出第1行第1列的数据,这也就是统计出的结果了。

那如果我们想要统计出news表中评论的总数量该怎样写呢?代码以下所示:

SQLiteDatabase db = dbHelper.getWritableDatabase(); Cursor c = db.rawQuery("select sum(commentcount) from news", null); if (c != null && c.moveToFirst()) { int count = c.getInt(0); Log.d("TAG", "result is " + count); } c.close();
我们发现,代码基本是非常类似的,只不过查询语句当中count()函数替换成了sum()函数。固然了,sum()函数要求传入1个指定的列名,表示我们要汇总这1列的总合,因此这里我们传入了commentcount这1列。

其它聚合函数的用法也是类似的,就不逐一罗列了。由此我们可以总结出1些结论,聚合函数都是要使用rawQuery()方法进行SQL查询,然后结果会封装到Cursor对象当中,接着我们再从Cursor中将结果取出。虽然说你可能觉得上面的用法已足够简单了,由于总共也就只写了67行代码,但是你有无想过更简单的写法,比如说只用1行代码就完成聚合查询操作。你没有看错,就是1行代码,LitePal让这些都成了可能,那末下面我们就来学习1下LitePal中聚合函数的用法。

使用LitePal的聚合函数

LitePal中1共提供了count()、sum()、average()、max()和min()这5种聚合函数,基本上已将SQL语句当中最经常使用的几种聚合函数都覆盖了,那末下面我们就来对这5种聚合函数的用法逐一进行学习。

count()

count()方法主要是用于统计行数的,刚才演示了如何通过SQL语句来统计news表中1共有多少行,那末下面我们来看1下如何通过LitePal来实现一样的功能,代码以下所示:

int result = DataSupport.count(News.class);
你没有看错!就是这样1行代码就能够了。调用DataSupport类当中的count()方法,count()方法接收1个Class参数,用于指定去统计哪张表当中的数据,然后返回值是1个整型数据,也就是统计出的结果了。

除此以外,LitePal中所有的聚合函数都是支持联缀的,也就是说我们可以在统计的时候加入条件语句。比如说想要统计1共有多少条新闻是零评论的,就能够这样写:

int result = DataSupport.where("commentcount = ?", "0").count(News.class);
这个用法和我们在上1篇文章当中学到的联缀查询是比较像的,在DataSupport类中首先指定1个where语句用于条件束缚,然后联缀1个count()方法,这样统计出的就是满足条件语句的结果了。联缀不但适用于count()方法,也一样适用于下面我们将要介绍的所有方法,但由于用法都是相同的,后面就不再重复介绍了。

sum()

看完了count()方法应当是觉得非常简单吧,剩下的几个聚合函数也是一样简单的,我们继续来学习1下。

sum()方法主要是用于对结果进行求合的,比如说我们想要统计news表中评论的总数量,就能够这样写:

int result = DataSupport.sum(News.class, "commentcount", int.class);
sum()方法的参数要略微多1点,我们来逐一看下。第1个参数很简单,还是传入的Class,用于指定去统计哪张表当中的数据。第2个参数是列名,表示我们希望对哪个列中的数据进行求合。第3个参数用于指定结果的类型,这里我们指定成int型,因此返回结果也是int型。

需要注意的是,sum()方法只能对具有运算能力的列进行求合,比如说整型列或浮点型列,如果你传入1个字符串类型的列去求合,肯定是得不到任何结果的,这时候只会返回1个0作为结果。

average()

average()方法主要是用于统计平均数的,比如说我们想要统计news表中平均每条新闻有多少评论,就能够这样写:

double result = DataSupport.average(News.class, "commentcount");
其中average()方法接收两个参数,第1个参数不用说,依然是Class。第2个参数用于指定列名的,表示我们想要统计哪1列的平均数。需要注意的是,这里返回值的类型是double型,由于平均数基本上都是会带有小数的,用double类型可以最大程序保存小数位的精度。

一样地,average()方法也只能对具有运算能力的列进行求平均值,如果你传入了1个字符串类型的列,也是没法得到任何结果的,这时候一样只会返回1个0作为结果。

max()

max()方法主要用于求出某个列中最大的数值,比如我们想要知道news表中所有新闻里面最高的评论数是多少,就能够这样写:

int result = DataSupport.max(News.class, "commentcount", int.class);
可以看到,max()方法接收3个参数,第1个参数一样还是Class,用于指定去统计哪张表当中的数据。第2个参数是列名,表示我们希望统计哪一个列中的最大值。第3个参数用于指定结果的类型,根据实际情况来选择传入哪一种类型就好了。

那末不用多说,max()方法也只能对具有运算能力的列进行求最大值的,希望你在使用的时候能够谨记这1点。

min()

min()方法主要用于求出某个列中最小的数值,比如我们想要知道news表中所有新闻里面最少的评论数是多少,就能够这样写:

int result = DataSupport.min(News.class, "commentcount", int.class);
min()方法和max()方法的用法基本上是1模1样的,参数也是完全相同,只是方法名变了1下。它们1个是求出某1列中的最大值,1个是求出某1列中的最小值,仅此而已。

现在我们已将LitePal中所有聚合函数的用法全部都学习完了,怎样样,是否是感觉非常的简单?学完以后相信大家也意想到我在开篇的时候其实不是在吹牛皮了,确确切实只需要1行代码就能够完成各种聚合查询操作了,上面任何1个统计操作我们都没有写到第2行代码。

好了,经过8篇文章的学习,我们已将LitePal中最主要的功能基本都学习完了,相信你从头看到这里,也是经历了1个对LitePal零认识,到目前可以熟练使用LitePal的1个进程。那末我们的这个Android数据库高手秘籍教程到这里也就要暂停了,这个系列短时间不会再更新,而是等到LitePal发布了新版本,有了新功能以后才会对它继续进行讲授。后面我依然会继续分享更多Android技术相干的其它文章,感谢大家对本专栏的延续关注。

LitePal开源项目地址:https://github.com/LitePalFramework/LitePal

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐