2010-06-03 11 views
7

Je suis un débutant à Android. En fait, je veux interroger les données du fournisseur de médias avec le fournisseur de contenu & résolveur de contenu.Comment interroger un fournisseur MEDIA avec l'option "grouper"?

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

Ma question est, comment puis-je interroger les données de fournisseur de médias ci-dessous en utilisant une clause GROUP BY:

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

J'ai essayé d'installer projection et where comme suit:

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

et where:

_data LIKE "A" OR _data LIKE "B" 

mais, je ne pouvais pas trouver comment définir l'option de requête GROUP BY _id.

S'il vous plaît aidez-moi.

Répondre

3

Je ne suis pas sûr si cela est possible.

Je luttais avec des choses similaires récemment, et j'ai réussi à contourner le problème en insérant les données de ContentProvider dans une table temporaire et en interrogeant la table pour les résultats.

L'histoire est que les données derrière un ContentProvider pourraient ne pas être une base de données. Il peut s'agir de XML, JSON, FileSystem etc ... Donc ceux-ci n'ont pas l'option GROUP BY, et donc ils l'ont omis. Vous ne pouvez pas toujours supposer que count(_id) fonctionnera.

4

Vous ne pouvez pas à partir d'un ContentProvider. Maintenant, si vous écrivez votre ContentProvider, vous pouvez l'implémenter. À l'intérieur de votre fournisseur de contenu, vous devez utiliser une classe SQLiteQueryBuilder qui a une méthode query() qui prend une chaîne GROUP BY.

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

Cette classe a aussi une méthode setDistinct(true) qui définit la requête comme DISTINCT, comme vous vous avez indiqué dans votre besoin instruction SQL.

+0

Content Group est mis en œuvre par fournisseur ici: 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); 

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

+1

cela ne fonctionne plus dans ICS ... – njzk2

+0

semble comme cela pourrait ne pas être un hack entièrement fiable –

1

d'abord tout excuser mon mauvais anglais! Je suis nouveau à Java/Android, a commencé avec 4.2.1 et se battre avec cela aussi près de 2 jours, alors je commence à lire plus de détails sur SQLiteQueryBuilder la partie query est à peu près ce que vous cherchez;)

-il:

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

la "fonction" de requête du fournisseur de contenu ne vous donne:

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

ici u peut duper autour, je vais vous poster mon code snip:

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

c'est son!

ici le code i utiliser pour exécuter:

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