Как сделать запрос у поставщика СМИ с опцией «group by»? - PullRequest
7 голосов
/ 03 июня 2010

Я новичок в 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;

Я попытался установить projection и where следующим образом:

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

и where:

_data LIKE "A" OR _data LIKE "B"

но я не смог найти, как установить опцию запроса GROUP BY _id.

Пожалуйста, помогите мне.

Ответы [ 4 ]

9 голосов
/ 18 октября 2011
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 голосов
/ 03 июня 2010

Вы не можете от ContentProvider. Теперь, если вы пишете свой ContentProvider, вы можете реализовать его. Внутри вашего контент-провайдера вы должны использовать класс SQLiteQueryBuilder, который имеет метод query(), который принимает строку GROUP BY.

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

В этом классе также есть метод setDistinct(true), который устанавливает запрос как DISTINCT, как вы указали в своем выражении SQL.

3 голосов
/ 03 июня 2010

Я не уверен, если это возможно.

В последнее время я боролся с подобными вещами, и мне удалось обойти эту проблему, вставив данные из ContentProvider во временную таблицу и запросив у таблицы результаты.

Дело в том, что данные, стоящие за ContentProvider, могут не являться базой данных.Это может быть XML, JSON, FileSystem и т. Д. Таким образом, у них нет опции GROUP BY, и поэтому они не включены.Вы также не можете всегда предполагать, что count(_id) будет работать.

1 голос
/ 30 мая 2014

Прежде всего, извините, мой плохой английский! Я новичок в 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);
...