2010-06-03 1 views
7

Sono un novizio per Android. In realtà, desidero interrogare i dati dal provider di contenuti multimediali con il content provider &.Come eseguire una query dal provider MEDIA con l'opzione "raggruppa per"?

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

La mia domanda è: come posso interrogare i dati dal fornitore di media come di seguito utilizzando una clausola GROUP BY:

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

Ho provato a fissare projection e where come segue:

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

e where:

_data LIKE "A" OR _data LIKE "B" 

ma, non sono riuscito a trovare come impostare l'opzione di query GROUP BY _id.

Per favore aiutatemi.

risposta

3

Non sono sicuro che sia possibile.

Ultimamente stavo lottando con cose simili, e sono riuscito a risolvere il problema inserendo i dati da ContentProvider in una tabella temporanea e interrogando la tabella per i risultati.

La storia è che i dati dietro a ContentProvider potrebbero non essere un database. Può essere XML, JSON, FileSystem ecc ... Quindi questi non hanno l'opzione GROUP BY, e quindi l'hanno lasciata fuori. Inoltre, non è possibile supporre che funzionerà sempre count(_id).

4

Non è possibile da un ContentProvider. Ora, se stai scrivendo il tuo ContentProvider potresti implementarlo. All'interno del tuo fornitore di contenuti dovresti utilizzare una classe SQLiteQueryBuilder che ha un metodo che accetta una stringa GROUP BY.

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

Questa classe ha anche un metodo setDistinct(true) che imposta la query come DISTINCT, come avete indicato si richiede nell'istruzione SQL.

+0

Content Provider Group By è implementato qui: 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); 

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

+1

questo non funziona più in ICS ... – njzk2

+0

sembra come questo potrebbe non essere un hack completamente affidabile –

1

Prima di tutto scusate il mio povero inglese! Sono nuovo di Java/Android, iniziato con 4.2.1 e combattere con che anche quasi 2 giorni, poi inizio a leggere qualche dettaglio in più sulla SQLiteQueryBuilder parte query è più o meno quello che u sta cercando;)

si hanno:

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

la "funzione" di query del provider di contenuti si dà solo:

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

qui u può ingannare intorno, mi post il mio codice di 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; 
} 

questo è tutto!

qui il codice che uso per eseguire:

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