【问题标题】:How do I get the _count in my content provider?如何在我的内容提供商中获取 _count?
【发布时间】:2010-10-02 20:44:44
【问题描述】:

我应该怎么做才能让我的内容提供者返回包含记录数的 _count 列?文档说它是自动的,但也许它只需要一些内置的内容提供程序。对数据库运行查询似乎不会返回它。

【问题讨论】:

    标签: android count android-contentprovider


    【解决方案1】:

    如果您使用的是 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 由 sql 数据库支持。
    • UserDictionary.Words 是否由 sql 数据库支持?
    • 目前这不起作用:“无效列计数(*)AS 计数”
    • count(*) 不再支持。Android Q
    • @NileshDeokar API 的替代方案是什么> =Q?
    【解决方案2】:

    如果您使用ContentProvider.query(),则返回Cursor。调用Cursor.getCount() 获取返回游标中的记录数。

    【讨论】:

    • 这个问题是它实际上执行查询并为记录分配内存等。有一个更好的方法来获取计数,就像 SQL 语句“SELECT COUNT(*) FROM TABLE " ...我会继续寻找这个替代答案。
    • 您可以在不获取所有记录的情况下获取计数。看看我下面的答案..
    • 这不会让提供者支持 _count 列:如果您不从投影中过滤掉“_count”列,SqliteQueryBuilder 将抛出异常。
    • 使用 cursor.getCount() 你不能保证它返回的项目的真实数量。有更好的方法: 1- 如果您使用内容提供程序,您可以进行查询并使用 BaseColumns 中包含的列 (_COUNT) 进行投影 2- 使用 SELECT COUNT(*) 进行 rawQuery
    • @mobibob : a/ 不能保证您的 contentprovider 由 sql 数据库支持 b/ 游标专门用于不为所有记录分配内存。
    【解决方案3】:

    我遇到了类似的问题,发现这对我有用。在下面的示例中,我想从 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】:

      对于cursor.getCount(),您不能保证它返回的项目数是真实的。还有很多更好的方法:

      1- 如果您使用的是 Content Providers,您可以进行查询并使用 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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-07
        • 1970-01-01
        • 2020-11-30
        • 1970-01-01
        • 2011-04-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多