Android SQLite查询“SELECT count(*) FROM table”时出现游标越界异常

13

以下函数导致了一个数组越界异常...

public void count(){
    SQLiteDatabase db = table.getWritableDatabase();
    String count = "SELECT count(*) FROM table";
    Cursor mcursor = db.rawQuery(count, null);
    int icount = mcursor.getInt(0);
    System.out.println("NUMBER IN DB: " + icount);
}

这个函数本应该返回数据库中的行数。有人知道出了什么问题吗?也许我的方法不正确吗?

3个回答

47

你错过了

mcursor.moveToFirst();

public void count(){
    SQLiteDatabase db = table.getWritableDatabase();
    String count = "SELECT count(*) FROM table";
    Cursor mcursor = db.rawQuery(count, null);
    mcursor.moveToFirst();
    int icount = mcursor.getInt(0);
    System.out.println("NUMBER IN DB: " + icount);
}

但是你应该使用更好的方法来完成这个任务,比如使用DatabaseUtils内置的辅助工具

比如:

public long count() {
    return DatabaseUtils.queryNumEntries(db,'tablename');
}

如果你在执行总数查询时有where条件,使用DatabaseUtils.longForQuery()来获取第一列的long值可能会更有帮助。这样更简单,也不需要用Cursor来处理大量信息。


艾丹,如果你认为这是正确的答案,你应该点击“打勾”标记。 - J-16 SDiZ
@J-16 SDiZ 只有在 15 分钟后才能将答案标记为已接受。@Joubarc 可能 DatabaseUtils 更加优化,比您使用 getCount() 的代码更快。 - Pentium10
@Pentium10: "DatabaseUtils.queryNumEntries"仍然是一个好的选择吗?还是已经被弃用了? - AJW
好的。对于大量行,使用DatabaseUtils方法是否比使用getCount()方法更快? - AJW
不,你不应该认为其中一种方法在执行时间上更快。但是对于开发人员来说,使用这些方法编写代码更容易和更快。 - Pentium10
显示剩余2条评论

3
需要将光标移动到第一行(也是唯一的一行)。
Cursor mcursor = db.rawQuery(count, null);
mcursor.moveToFirst();
int icount = mcursor.getInt(0);

0

如果您想获取特定ID或值的行数,可以使用此功能。

public int numbersOfrows (int id) {
        SQLiteDatabase db = this.getReadableDatabase();
        int numbersOfrows = 0 ;

        Cursor c = db.rawQuery("select count(*) from table_name where Column_name = 'yourValue'")
        if (c.moveToFirst()){
            numbersOfrows = c.getInt(0);
        }

        return numbersOfrows ;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接