2010-06-03 8 views
7

Ich bin ein Neuling für Android. Eigentlich möchte ich Daten von Medienanbieter mit Inhaltsanbieter & Content Resolver abfragen.Wie kann man vom MEDIA-Anbieter mit der Option "Gruppieren nach" abfragen?

c = mContent.query(CONTENT_URI,projection,where,null,null); 

Meine Frage ist, wie kann ich Daten aus Medienanbieter abzufragen, wie unten mit einer GROUP BY Klausel:

select DISTINCT _id, count(_id), _data FROM aaa_table WHERE _data LIKE "A" OR _data LIKE "B" GROUP BY _id; 

Ich habe versucht, projection und where Einstellung wie folgt:

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

und where:

_data LIKE "A" OR _data LIKE "B" 

aber ich konnte nicht finden, wie man die Abfrageoption GROUP BY _id einstellt.

Bitte helfen Sie mir.

Antwort

3

Ich bin mir nicht sicher, ob das möglich ist.

Ich hatte in letzter Zeit mit ähnlichen Dingen zu kämpfen, und ich schaffte es, umgehen, indem Sie die Daten aus ContentProvider in eine temporäre Tabelle und Abfrage der Tabelle für Ergebnisse. Die Geschichte ist, dass die Daten hinter einer ContentProvider möglicherweise keine Datenbank sind. Es kann XML, JSON, FileSystem etc ... sein. Diese haben also nicht die Option GROUP BY und deshalb haben sie es weggelassen. Sie können auch nicht immer davon ausgehen, dass count(_id) funktioniert.

4

Sie können nicht von einer ContentProvider. Nun, wenn Sie Ihre ContentProvider schreiben, könnten Sie es implementieren. In Ihrem Content-Provider müssten Sie eine Klasse SQLiteQueryBuilder verwenden, die eine query()-Methode hat, die eine GROUP BY-Zeichenfolge verwendet.

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

Diese Klasse hat auch eine setDistinct(true) Methode, die die Abfrage als verschiedene Sätze, wie Sie Sie in Ihrer SQL-Anweisung angegeben erfordern.

+0

Content Provider Group By hier implementiert: https://github.com/novoda/SQLiteProvider – Blundell

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); 

referance page = http://zengyan2012.iteye.com/blog/1118963

+1

das nicht mehr in ICS funktioniert ... – njzk2

+0

scheint so könnte das kein absolut zuverlässiger Hack sein –

1

ersten off all mein armes Englisch entschuldigen! Ich bin neu in Java/Android, begann mit 4.2.1 und kämpfen mit, dass zu fast 2 Tage, dann fange ich einige weitere Details lesen über SQLiteQueryBuilder der query Teil ist so ziemlich das, was u für suchen;)

es hat:

public Cursor query (SQLiteDatabase db, String[] projectionIn, String selection, String[] selectionArgs, String groupBy, String having, String sortOrder) 

die Abfrage "Funktion" der Content-Provider gibt Ihnen nur:

query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) 

hier kann u um Trick, ich werde nach dir meinen Code Schnipsel:

@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; 
} 

das ist es!

hier der Code i ausführen verwenden:

 Cursor showsc = getContext().getContentResolver().query(
      WhatsOnTVProvider.CONTENT_EPISODES_NEXT_URI, 
      EpisodenTable.allColums_inclCount, 
      String.valueOf(Calendar.getInstance().getTimeInMillis()/1000) 
        + " < date", null, null); 
Verwandte Themen