dbm
dbm

Reputation: 10485

GROUP BY with CursorLoader

How do I define a GROUP BY query for my CursorLoader?

The two constructors for a CursorLoader I see take either a single Context or a Context, Uri, projection, selection, selectionArgs and sortOrder.

But no groupBy.

(I'm using the support package for a Android 2.3 device)

Upvotes: 10

Views: 7205

Answers (3)

Gaurav
Gaurav

Reputation: 3773

You can add Group by with selection parameter

new CursorLoader(context,URI,
                        projection,
                                selection+") GROUP BY (coloum_name",
                        null,null);

Upvotes: 7

JPMagalhaes
JPMagalhaes

Reputation: 3621

Not really...

You can define a specific URI to your specific GROUP BY clause.

For example, if you have a table mPersonTable, possibly grouped by gender, you can define the following URIs:

PERSON
PERSON/#
PERSON/GENDER

When querying, switch between your queries so you can add your group by parameter:

public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
   String groupBy = null;
   switch (mUriMatcher.match(uri)) {
      case PERSON_ID:
         ...
         break;
      case PERSON_GENDER:
         groupBy = GENDER_COLUMN;
      case PERSON:
        SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
        builder.setTables(mPersonTable);
        builder.setProjectionMap(mProjectionMap);
        return builder.query(db, projection, selection, selectionArgs, groupBy, having, sortOrder, limit);
      default:
         break;
   }
}

In fact, you could pass any sort of parameters to your query

Obs.: Use a UriMatcher to match the uri with your query implementation.

Upvotes: 25

dbm
dbm

Reputation: 10485

Apparently (and this is a bit embarrassing) the very first line in the documentation clearly states that the CursorLoader queries the ContentResolver to retrieve the Cursor. While the ContentResolver doesn't expose any means to GROUP BY there is, hence, no way the CursorLoader could expose such functionality either.

So the apparent answer to my very own question is: You can't!

Upvotes: 4

Related Questions