Vraag Hoe krijg ik de _count in mijn inhoudsprovider?


Wat moet ik doen om ervoor te zorgen dat mijn inhoudsprovider de kolom _count retourneert met het aantal records? De documentatie zegt dat het automatisch is, maar misschien neemt het slechts een of andere ingebouwde contentprovider in beslag. Een query uitvoeren naar de database lijkt deze niet te retourneren.


35
2018-01-22 06:27


oorsprong


antwoorden:


Als je gebruikt ContentProvider.query() een Cursor wordt teruggestuurd. telefoontje Cursor.getCount() om een ​​telling van records in de geretourneerde cursor te krijgen.


10
2018-01-22 22:41



Als u contentProvider gebruikt, moet u het doen zoals count(*) AS count.

Als je gebruikt cursor.getCount(), dat zou niet zo efficiënt zijn als de bovenstaande benadering. Met cursor.getCount() je haalt alle records op om alleen maar te tellen. De volledige code moet er als volgt uitzien:

 Cursor countCursor = getContentResolver().query(CONTENT_URI,
                new String[] {"count(*) AS count"},
                null,
                null,
                null);

        countCursor.moveToFirst();
        int count = countCursor.getInt(0);

De reden waarom dit werkt is omdat Android een kolomnaam nodig heeft om gedefinieerd te worden.


122
2018-05-09 10:13



Ik had een vergelijkbaar probleem en merkte dat dit voor mij werkte. In het onderstaande voorbeeld wilde ik het aantal afbeeldingen ophalen van de MediaStore-provider.

        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);

3
2018-03-25 01:23



Met cursor.getCount() u kunt niet garanderen dat het het werkelijke aantal geretourneerde items retourneert. Er zijn veel betere manieren:

1- Als u inhoudsproviders gebruikt, kunt u een query uitvoeren en de Column (_COUNT) opgenomen in BaseColumns voor uw projectie

@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- Een rawQuery doen met SELECT COUNT(*) zoals @saurabh zegt in zijn reactie.


1
2017-11-06 15:36