コンテンツ プロバイダが _count 列にレコード数を返すようにするにはどうすればよいですか? ドキュメントには自動であると書かれていますが、ビルトインのコンテンツ プロバイダーにしかかかっていない可能性があります。データベースに対してクエリを実行しても返されないようです。
4 に答える
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 で列名を定義する必要があるためです。
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- コンテンツ プロバイダーを使用している場合は、クエリを実行し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- SELECT COUNT(*)
@saurabh が応答で述べているように、rawQuery を実行するには。