我有一个包含以下列的SQLite表内容:

-----------------------------------------------
|id|book_name|chapter_nr|verse_nr|word_nr|word|
-----------------------------------------------

sql查询
select count(*) from content where book_name = 'John'
group by book_name, chapter_nr

DB Browser中返回21行(这是章节数)

相当于ORMLite android:
long count = getHelper().getWordDao().queryBuilder()
                        .groupByRaw("book_name, chapter_nr")
                        .where()
                        .eq("book_name", book_name)
                        .countOf();

返回828行(这是经文的计数)

据我所知,以上代码被翻译为:
select count(*) from content
where book_name = 'John'
group by book_name, chapter_nr

在数据库浏览器中的结果:
   | count(*)
------------
 1 | 828
 2 | 430
 3 | 653
...
 21| 542
---------
21 Rows returned from: select count(*)...

因此在我看来,ORMLite作为countOf()的结果返回查询的第一行。

我已经搜索了很多计算器和谷歌。我找到了这个question(更有趣的是答案)

您还可以通过在Where或QueryBuilder对象上调用> countOf()方法来计算自定义查询中的行数。

//计算此自定义查询中的行数
int numRows = dao.queryBuilder()。where()。eq(“name”,“Joe Smith”)。countOf();

这就是我在做什么(如果我错了,请纠正我),但是以某种方式我得到的行数错误。

所以...我在这里做错了什么,或者countOf()没有按照预期的方式工作。

注意:groupBy而不是groupByRaw是相同的(根据ORMLite文档的介绍,加入groupBy应该可以)
...
.groupBy("book_name")
.groupBy("chapter_nr")
.where(...)
.countOf()

编辑:getWordDaoWord类返回:
@DatabaseTable(tableName = "content")
public class Word { ... }

最佳答案

返回828行(这是经文的计数)

这似乎是QueryBuilder.countOf()机制的限制。它期望一个值,并且不了解在查询计数中添加GROUP BY的情况。您可以说不是,因为该方法返回一个long

如果要提取每个组的计数,则看起来需要执行raw query check out the docs

08-05 16:38