Исключено из исключения SQL SQLite Cursor вне пределов на счете SELECT (*) FROM table

Следующая функция дает мне исключение из пределов...

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);
}

Он предназначен для возврата количества строк в базе данных. Кто-нибудь знает, что случилось? я, возможно, неправильно выполняю эту задачу?

Ответы

Ответ 1

Вы пропустили

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');
}

Возможно, вам будет полезно использовать DatabaseUtils.longForQuery(), чтобы получить значение первого столбца, когда у вас есть запрос на общий счет. Это проще, и вам не нужна эта куча работы с курсором.

Ответ 2

нужно переместить курсор в первую (и только) строку

Cursor mcursor = db.rawQuery(count, null);
mcursor.moveToFirst();
int icount = mcursor.getInt(0);

Ответ 3

вы можете использовать это, если хотите получить число строк для определенного идентификатора или значения

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 ;
    }