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

问题描述 投票:8回答:5

我是Android的新手。实际上,我想使用内容提供程序和内容解析器从媒体提供程序查询数据。

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

请帮助我。

android android-contentprovider
5个回答
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


4
投票

您不能从ContentProvider开始。现在,如果您正在编写ContentProvider,则可以实现它。在内容提供者内部,您必须使用SQLiteQueryBuilder类,该类具有采用query()字符串的GROUP BY方法。

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

此类还具有setDistinct(true)方法,该查询将查询设置为DISTINCT,如您在SQL语句中所指示的。


3
投票

我不确定是否可以。

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

故事是ContentProvider后面的数据可能不是数据库。它可以是XML,JSON,FileSystem等。因此这些没有GROUP BY选项,因此将其忽略了。您也不能总是认为count(_id)可以正常工作。


1
投票

首先,我的英语不好!我是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);

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
    )
© www.soinside.com 2019 - 2024. All rights reserved.