【发布时间】:2010-10-02 20:44:44
【问题描述】:
我应该怎么做才能让我的内容提供者返回包含记录数的 _count 列?文档说它是自动的,但也许它只需要一些内置的内容提供程序。对数据库运行查询似乎不会返回它。
【问题讨论】:
标签: android count android-contentprovider
我应该怎么做才能让我的内容提供者返回包含记录数的 _count 列?文档说它是自动的,但也许它只需要一些内置的内容提供程序。对数据库运行查询似乎不会返回它。
【问题讨论】:
标签: android count android-contentprovider
如果您使用的是 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需要定义一个列名。
【讨论】:
count(*) 不再支持。Android Q
如果您使用ContentProvider.query(),则返回Cursor。调用Cursor.getCount() 获取返回游标中的记录数。
【讨论】:
我遇到了类似的问题,发现这对我有用。在下面的示例中,我想从 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);
【讨论】:
对于cursor.getCount(),您不能保证它返回的项目数是真实的。还有很多更好的方法:
1- 如果您使用的是 Content Providers,您可以进行查询并使用 BaseColumns 中包含的 Column (_COUNT) 进行投影
@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- 正如@saurabh 在他的回复中所说,使用SELECT COUNT(*) 进行rawQuery。
【讨论】: