2012-05-14 19 views
9

Wie definiere ich eine GROUP BY Abfrage für meinen CursorLoader?GROUP BY mit CursorLoader

Die beiden Konstrukteure für eine CursorLoader Ich sehe entweder eine einzelne Context oder ein Context, Uri, projection, selection, selectionArgs und sortOrder.

Aber keine groupBy.

(Ich verwende das Support-Paket für ein Android 2.3-Gerät)

Antwort

24

Nicht wirklich ...

Sie können eine bestimmte URI an Ihre spezifischen GROUP BY-Klausel definieren.

Zum Beispiel, wenn Sie eine Tabelle mPersonTable, möglicherweise nach Geschlecht gruppiert, können Sie die folgenden URIs definieren:

PERSON 
PERSON/# 
PERSON/GENDER 

Beim Abfragen, wechseln Sie zwischen Ihren Abfragen, so dass Sie Ihre Gruppe von Parametern hinzufügen:

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 der Tat könnte man jede Art von Parametern auf Ihre Anfrage passieren

Obs .: a UriMatcher Verwenden Sie die uri mit Ihrer Anfrage Implementierung übereinstimmen.

+1

Dies ist eigentlich eine große Work-around ist, obwohl es den Content-Provider erfordert, sie zu unterstützen! Vielen Dank! – dbm

+0

Ja, natürlich! Bitte. – JPMagalhaes

+0

@JPMagalhaes: Bitte helfen Sie mir. Ich mache dasselbe, aber ich bekomme nicht, wie ich dieses Werkzeug bekomme. Kannst du bitte etwas mehr Code schreiben, um es zu ändern? –

2

Anscheinend (und das ist ein bisschen peinlich) die erste Zeile in den documentation eindeutig fest, dass die CursorLoader fragt die ContentResolver die Cursor abrufen . Während die ContentResolver keine Mittel zu GROUP BY aussetzt, gibt es daher keine Möglichkeit, die CursorLoader solche Funktionalität auch offen legen.

So die scheinbare Antwort auf meine eigene Frage ist: Sie können nicht!

6

Sie können Gruppen hinzufügen, indem Sie mit Auswahl Parameter

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

Ich markiere dies als nützlich, weil es scheint, die einzige Antwort zu sein, die mit vorhandenen Inhaltsanbietern funktioniert (Sie können kein URI für die Gruppe hinzufügen). Aber es ist ein bisschen beängstigend, dass es funktioniert. –