Как я могу получить _count в моем контент-провайдере? - PullRequest
36 голосов
/ 22 января 2009

Что я должен сделать, чтобы мой поставщик контента возвратил столбец _count с количеством записей? Документация говорит, что это автоматический, но, возможно, он требует только встроенного поставщика контента. Кажется, что выполнение запроса к базе данных не возвращает его.

Ответы [ 4 ]

125 голосов
/ 09 мая 2011

Если вы используете contentProvider, тогда вы должны сделать это как count(*) AS count.

Если вы используете cursor.getCount(), это будет не так эффективно, как описанный выше подход. С cursor.getCount() вы извлекаете все записи только для подсчета. Весь код должен выглядеть следующим образом -

 Cursor countCursor = getContentResolver().query(CONTENT_URI,
                new String[] {"count(*) AS count"},
                null,
                null,
                null);

        countCursor.moveToFirst();
        int count = countCursor.getInt(0);

Причина, по которой это работает, заключается в том, что для android необходимо определить имя столбца.

11 голосов
/ 23 января 2009

Если вы используете ContentProvider.query(), то возвращается Cursor. Вызовите Cursor.getCount(), чтобы получить количество записей в возвращенном курсоре.

3 голосов
/ 25 марта 2011

У меня была похожая проблема, и я понял, что это работает для меня. В приведенном ниже примере я хотел получить количество изображений от поставщика MediaStore.

        final String[] imageCountProjection = new String[] {
                "count(" + MediaStore.Images.ImageColumns._ID + ")",
        };

        Cursor countCursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                imageCountProjection,
                null,
                null,
                null);

        countCursor.moveToFirst();
        int existingImageCount = countCursor.getInt(0);
1 голос
/ 06 ноября 2013

С cursor.getCount() вы не можете гарантировать, что он возвращает реальное количество возвращенных предметов. Есть гораздо лучшие способы:

1 - Если вы используете контент-провайдеров, вы можете сделать запрос и использовать Column (_COUNT), включенный в BaseColumns для вашей проекции

@Override
public Cursor query(SQLiteDatabase db, Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    ...

    projection = new String[] {
        ContentContract.NotificationCursor.NotificationColumns._COUNT,
    };

    ...

    Cursor cursor = queryBuilder.query(db, projection, selection, selectionArgs, groupBy, having, sortOrder);
    return cursor;
}

2 - Чтобы выполнить rawQuery, используя SELECT COUNT(*), как @saurabh говорит в своем ответе.

...