2010-06-03 7 views
7

Soy un novato en Android. En realidad, quiero consultar los datos del proveedor de medios con el proveedor de contenido & de resolución de contenido.¿Cómo consultar desde el proveedor de MEDIA con la opción "agrupar por"?

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

Mi pregunta es, ¿cómo puedo consultar datos de proveedor de los medios de comunicación como a continuación utilizando una cláusula GROUP BY:

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

He intentado fijar projection y where de la siguiente manera:

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

y where:

_data LIKE "A" OR _data LIKE "B" 

pero no pude encontrar la opción de consulta GROUP BY _id.

Por favor, ayúdame.

Respuesta

3

No estoy seguro si eso es posible.

Estuve luchando con cosas similares últimamente, y logré solucionarlo insertando los datos de ContentProvider en una tabla temporal y consultando la tabla para obtener resultados.

La historia es que los datos detrás de ContentProvider podrían no ser una base de datos. Puede ser XML, JSON, FileSystem, etc ... Por lo tanto, estos no tienen la opción GROUP BY, y por lo tanto, lo omitieron. Tampoco puede suponer siempre que count(_id) funcionará.

4

No se puede desde ContentProvider. Ahora, si está escribiendo su ContentProvider, puede implementarlo. Dentro de tu proveedor de contenido deberías usar una clase SQLiteQueryBuilder que tiene un método query() que toma una cadena GROUP BY.

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

Esta clase también tiene un método setDistinct(true) que establece la consulta como algo distinto, como usted ha indicado que necesita en la instrucción SQL.

+0

Proveedor de Contenido Grupo A se implementa aquí: 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); 

página referance = http://zengyan2012.iteye.com/blog/1118963

+1

esto no funciona más en el ICS ... parece – njzk2

+0

como este podría no ser un truco completamente confiable –

1

Primero de todo excusar mi pobre Inglés! Soy nuevo en Java/Android, comenzó con 4.2.1 y luchar con eso también casi 2 días, entonces me pongo a leer algunos detalles más sobre la parte SQLiteQueryBuilderquery es más o menos que lo que buscas es;)

que tiene:

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

la "función" consulta del proveedor de contenidos sólo le da:

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

aquí u puede engañar a todo, yo le publicar mi código 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; 
} 

thats its!

aquí el código que utilizo para ejecutar:

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