web-dev-qa-db-ja.com

コンテンツプロバイダーで_countを取得するにはどうすればよいですか?

コンテンツプロバイダーにレコード数を含む_count列を返すようにするにはどうすればよいですか?ドキュメントには自動であると書かれていますが、おそらくそれはいくつかの組み込みコンテンツプロバイダーについてのみ取っています。データベースに対してクエリを実行しても、クエリが返されないようです。

41
pupeno

ContentProvider.query()を使用している場合は、Cursorが返されます。 Cursor.getCount()を呼び出して、返されたカーソルのレコード数を取得します。

15
Will

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には列名を定義する必要があるためです。

126
saurabh

私も同様の問題を抱えていて、これでうまくいくことがわかりました。以下の例では、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
Frank Leigh

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を実行します。

1
cesards