コンテンツプロバイダーにレコード数を含む_count列を返すようにするにはどうすればよいですか?ドキュメントには自動であると書かれていますが、おそらくそれはいくつかの組み込みコンテンツプロバイダーについてのみ取っています。データベースに対してクエリを実行しても、クエリが返されないようです。
ContentProvider.query()
を使用している場合は、Cursor
が返されます。 Cursor.getCount()
を呼び出して、返されたカーソルのレコード数を取得します。
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には列名を定義する必要があるためです。
私も同様の問題を抱えていて、これでうまくいくことがわかりました。以下の例では、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-コンテンツプロバイダーを使用している場合は、クエリを実行し、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を実行します。