Что мне делать, чтобы заставить моего поставщика контента возвращать столбец _count с количеством записей? В документации говорится, что она автоматическая, но, возможно, она занимает только некоторый встроенный контент-провайдер. Выполнение запроса к базе данных, похоже, не возвращает его.
Как получить _count в моем контент-провайдере?
Ответ 1
Если вы используете ContentProvider.query()
, возвращается Cursor
. Вызовите Cursor.getCount()
, чтобы получить количество записей в возвращаемом курсоре.
Ответ 2
Если вы используете 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 требуется имя столбца, которое должно быть определено.
Ответ 3
У меня была подобная проблема, и я нашел, что это сработало для меня. В приведенном ниже примере я хотел получить количество изображений от поставщика 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);
Ответ 4
С помощью cursor.getCount() вы не можете гарантировать, что он вернет действительное количество возвращенных элементов. Есть намного лучшие способы:
1- Если вы используете Content Providers, вы можете сделать запрос и использовать столбец (_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 говорит в своем ответе.