如何使用“分组依据”选项从MEDIA提供商进行查询?

时间:2010-06-03 10:52:37

标签: android android-contentprovider

我是Android的新手。 实际上,我想通过Content provider& amp ;;查询来自媒体提供商的数据。内容解析器。

c = mContent.query(CONTENT_URI,projection,where,null,null); 

我的问题是,如何使用GROUP BY子句查询媒体提供商的数据,如下所示:

select DISTINCT _id, count(_id), _data FROM aaa_table WHERE _data LIKE "A" OR _data LIKE "B" GROUP BY _id;

我已尝试按如下方式设置projectionwhere

 final String[] projection = new String[] {
                "_id", 
                "COUNT ("+ _id +")" ,
                "_data" 
                }; 

where

_data LIKE "A" OR _data LIKE "B"

但是,我找不到如何设置查询选项GROUP BY _id

请帮帮我。

5 个答案:

答案 0 :(得分:9)

where = "_data LIKE 'A' OR _data LIKE 'B'";
where += ") GROUP BY (_id"; // note the char ')' and '(', the ContentResover will completed for U
c = mContent.query(CONTENT_URI,projection,where,null,null); 

参考页面= http://zengyan2012.iteye.com/blog/1118963

答案 1 :(得分:4)

你不能来自ContentProvider。现在,如果您正在撰写ContentProvider,那么您可以实施它。在您的内容提供商中,您必须使用SQLiteQueryBuilder类,其中query()方法带有GROUP BY字符串。

http://developer.android.com/reference/android/database/sqlite/SQLiteQueryBuilder.html

此类还有一个setDistinct(true)方法,可以将查询设置为DISTINCT,正如您在SQL语句中指出的那样。

答案 2 :(得分:3)

我不确定是否可能。

我最近遇到了类似的问题,我设法通过将ContentProvider中的数据插入临时表并查询表中的结果来解决问题。

故事是ContentProvider背后的数据可能不是数据库。它可以是XML,JSON,FileSystem等......所以这些没有GROUP BY选项,因此他们将其排除在外。你也不能总是认为count(_id)会起作用。

答案 3 :(得分:1)

首先请原谅我的POOR英语! 我是Java / Android的新手,从4.2.1开始并且用了近2天的战斗,然后我开始阅读更多有关SQLiteQueryBuilder的详细信息query部分几乎是什么你正在寻找;)

它有:

public Cursor query (SQLiteDatabase db, String[] projectionIn, String selection, String[] selectionArgs, String groupBy, String having, String sortOrder)

查询"功能"内容提供商只为您提供:

query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder)

在这里你可以欺骗我,我会发给你我的代码剪辑:

    @Override
public Cursor query(Uri uri, String[] projection, String selection,
        String[] selectionArgs, String sortOrder) {
    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
    final SQLiteDatabase db = mOpenHelper.getReadableDatabase();
/* a String is a Object, so it can be null!*/
    String groupBy = null;
    String having = null;

    switch (sUriMatcher.match(uri)) {
...
...
...
        case EPISODES_NEXT:
        groupBy = "ShowID";
        queryBuilder.setTables(EpisodenTable.TableName);
        break;
    default:
        throw new IllegalArgumentException("Unknown URI " + uri);
    }

    Cursor c = queryBuilder.query(db, projection, selection, selectionArgs,
            groupBy, having, sortOrder);
    c.setNotificationUri(getContext().getContentResolver(), uri);
    return c;
}

多数民众赞成!

这里是我用来执行的代码:

        Cursor showsc = getContext().getContentResolver().query(
            WhatsOnTVProvider.CONTENT_EPISODES_NEXT_URI,
            EpisodenTable.allColums_inclCount,
            String.valueOf(Calendar.getInstance().getTimeInMillis() / 1000)
                    + " < date", null, null);

答案 4 :(得分:0)

这种方法对我有用: (我已经找到了解决方法here

val projection = arrayOf(
        MediaStore.Images.Media.BUCKET_DISPLAY_NAME,
        MediaStore.MediaColumns.DATA
    )
    val selection = " 1=1 ) GROUP BY (${MediaStore.Images.Media.BUCKET_DISPLAY_NAME}"
    val cursor = contentResolver.query(
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
        projection,
        selection,
        null,
        null
    )