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

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

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

logo.png

传统的聚合函数用法

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

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()方法中我们指定了一个聚合查询语句,其中count(1)就是用于去统计一共有多少行的。当然这里并不一定要用count(1),使用count(*)或者count(主键)都可以。然后rawQuery()方法返回的是一个Cursor对象,我们从这个Cursor当中取出第一行第一列的数据,这也就是统计出的结果了。

那如果我们想要统计出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()函数要求传入一个指定的列名,表示我们要汇总这一列的总合,因此这里我们传入了commentcount这一列。

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

使用LitePal的聚合函数

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

count()

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

        int count = LitePal.count(News.class);
        Log.d(TAG, "---count=" + count);

调用LitePal类当中的count()方法,count()方法接收一个Class参数,用于指定去统计哪张表当中的数据,然后返回值是一个整型数据,也就是统计出的结果了。

除此之外,LitePal中所有的聚合函数都是支持连缀的,也就是说我们可以在统计的时候加入条件语句。比如说想要统计一共有多少条新闻是Android智能手机,就可以这样写:

int count = LitePal.where("title=?", "Android智能手机").count(News.class);
Log.d(TAG, "---count=" + count);

这个用法和我们在上一篇文章当中学到的连缀查询是比较像的,在LitePal类中首先指定一个where语句用于条件约束,然后连缀一个count()方法,这样统计出的就是满足条件语句的结果了。连缀不仅适用于count()方法,也同样适用于下面我们将要介绍的所有方法。

sum()

完了count()方法应该是觉得非常简单吧,剩下的几个聚合函数也是同样简单的

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

int result = LitePal.sum(News.class, "commentcount", int.class);

sum()方法的参数要稍微多一点,我们来一一看下。第一个参数很简单,还是传入的Class,用于指定去统计哪张表当中的数据。第二个参数是列名,表示我们希望对哪一个列中的数据进行求合。第三个参数用于指定结果的类型,这里我们指定成int型,因此返回结果也是int型。

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

average()

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

double result = LitePal.average(News.class, "commentcount");

其中average()方法接收两个参数,第一个参数不用说,仍然是Class。第二个参数用于指定列名的,表示我们想要统计哪一列的平均数。需要注意的是,这里返回值的类型是double型,因为平均数基本上都是会带有小数的,用double类型可以最大程序保留小数位的精度。

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

max()

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

int result = LitePal.max(News.class, "commentcount", int.class);

可以看到,max()方法接收三个参数,第一个参数同样还是Class,用于指定去统计哪张表当中的数据。第二个参数是列名,表示我们希望统计哪个列中的最大值。第三个参数用于指定结果的类型,根据实际情况来选择传入哪种类型就行了。

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

min()

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

int result = LitePal.min(News.class, "commentcount", int.class);

min()方法和max()方法的用法基本上是一模一样的,参数也是完全相同,只是方法名变了一下。它们一个是求出某一列中的最大值,一个是求出某一列中的最小值,仅此而已。

经过八篇文章的学习,我们已经将LitePal中最主要的功能基本都学习完了,相信你从头看到这里,也是经历了一个对LitePal零认识,到目前可以熟练使用LitePal的一个过程。欧耶

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 229,327评论 6 537
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,996评论 3 423
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 177,316评论 0 382
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,406评论 1 316
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,128评论 6 410
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,524评论 1 324
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,576评论 3 444
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,759评论 0 289
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,310评论 1 335
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,065评论 3 356
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,249评论 1 371
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,821评论 5 362
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,479评论 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,909评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,140评论 1 290
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,984评论 3 395
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,228评论 2 375

推荐阅读更多精彩内容

  • 在上一篇文章中,我们学习了LitePal框架来进行创建表操作的便利。我们在一开始创建的表结构,随着需求的变更,到了...
    as_pixar阅读 920评论 0 0
  • 今天下午分享会中看的微电影《小鹰的故事》,从里面领悟到的道理,在《居说》里的正爱篇里都找得到。 《鹰》:老鹰把小鹰...
    柏长升阅读 1,092评论 0 0
  • 那些成功学的书千万别去看, 什么陈安之, 都是扯大嗓门欺世盗名来着 1,成功是可以教的吗, 怀疑中, 2, 要怎么...
    Vivian338阅读 123评论 0 0
  • 随着他的慢慢长大,每天要求我们陪他搭积木,陪他玩飞机,玩超人游戏,要么就一个人看电视,玩手机,特别是看着朋友家的孩...
    宁宁安安阅读 180评论 0 0