2011-04-29 66 views
3

我在Android中使用SQLite。 我有查询,查询执行以及如何从光标打印计数。SQLite计数示例

Cursor dataCount = mDb.rawQuery("select count(*) from " + DATABASE_JOURNAL_TABLE, null); 

我没有表中的记录。

回答

4

可以由getInt(index)作为

cursor.getInt(1); // this is for example, you have to adjust index in your code 

光标也有一个内置的功能getCount()返回行号这样也可以这样做:

// assuming your table has `id` column as primary key or unique key. 
Cursor dataCount = mDb.rawQuery("select id from " + DATABASE_JOURNAL_TABLE, null); 
dataCount.getCount(); 

更多信息请参见android devloper's doc for Cursor

+0

你的第一个解决方案是错误的,该查询将返回一个 “COUNT(*)” 在索引0列,因此cursor.getInt(0)将返回表计数。你的第二个解决方案可以工作,但是不好的做法,它不会有小规模的问题,但是使用“select * from”来获得具有30列和10,000行的数据库表的计数将不会很好..... – 2013-07-09 03:52:51

+1

@SK'关于第一点,我只是举例说明,我无意用1作为索引。澄清添加了评论。你的第二点是完全有效的,对于大表得到*是个坏主意,应该从表中获得一个唯一的键(主要是主键),然后得到计数。 – 2013-07-09 04:02:57

+2

选择ID仍然很差,聚合计数功能是最好的方法。您滥用getCount()方法。 – 2013-07-09 04:19:48

8

您已经有了正确的方法。

Cursor cursor = database.rawQuery("select count(*) from " + DATABASE_JOURNAL_TABLE, null); 

// ensure there is at least one row and one column 
if (cursor.getCount() > 0 && cursor.getColumnCount() > 0) { 
    cursor.close(); 
    return cursor.getInt(0); 
} else { 
    cursor.close(); 
    return 0; 
} 

,您必须确保至少有1行1列,如果您提供的不存在也就没有列访问和cursor.getInt(0)会抛出异常的表。

来源:https://github.com/samkirton/SQLKing

+0

“cursor.moveToFirst()”方法在你的情况下会做什么?从表的第一个到最后一个都没有getCount迭代? – AJW 2016-01-09 16:17:15

+1

在返回之前需要cursor.close()! – kakopappa 2016-02-13 17:50:08

+0

虽然接受的答案可能有效(有一些限制/注意事项,如评论中所述),但这是一个更好的答案。 – JMD 2017-01-31 22:40:55