كيف يمكنني الحصول على _count في موفر المحتوى الخاص بي؟

StackOverflow https://stackoverflow.com/questions/468211

سؤال

ما الذي يجب علي فعله حتى يقوم موفر المحتوى الخاص بي بإرجاع عمود _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- إذا كنت تستخدم موفري المحتوى، فيمكنك إجراء استعلام واستخدام 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 في رده.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top