8

我是安卓新手。实际上,我想使用内容提供者和内容解析器从媒体提供者查询数据。

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;

我试过设置projection如下where

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

where

_data LIKE "A" OR _data LIKE "B"

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

请帮我。

4

5 回答 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

于 2011-10-18T09:21:20.290 回答
4

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

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

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

于 2010-06-03T19:45:38.967 回答
3

我不确定这是否可能。

最近我一直在为类似的事情苦苦挣扎,我设法通过将数据插入ContentProvider临时表并查询表以获取结果来解决问题。

故事是 a 背后的数据ContentProvider可能不是数据库。它可以是 XML、JSON、FileSystem 等……所以这些都没有GROUP BY选项,因此他们将其排除在外。你也不能假设总是这样count(_id)

于 2010-06-03T11:35:56.110 回答
1

首先请原谅我糟糕的英语!我是 Java/Android 的新手,从 4.2.1 开始并与之抗争了将近 2 天,然后我开始阅读有关SQLiteQueryBuilder的更多详细信息,查询部分几乎就是您正在寻找的;)

它有:

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);
于 2014-05-30T13:30:35.117 回答
0

这种方法对我有用:(我在这里找到了解决方案)

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
    )
于 2020-03-12T14:27:57.203 回答