Home » Android » android – GROUP BY with CursorLoader

android – GROUP BY with CursorLoader

Posted by: admin May 14, 2020 Leave a comment

Questions:

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)

How to&Answers:

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.

Answer:

You can add Group by with selection parameter

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

Answer:

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!