2012-05-14 34 views
9

¿Cómo puedo definir una consulta GROUP BY para mi CursorLoader?GROUP BY con CursorLoader

Los dos constructores para una CursorLoader veo tomar ya sea un solo Context o una Context, Uri, projection, selection, selectionArgs y sortOrder.

Pero no groupBy.

(estoy usando el paquete de apoyo para un dispositivo Android 2.3)

Respuesta

24

En realidad no ...

Se puede definir un URI específico para su grupo específico cláusula.

Por ejemplo, si usted tiene una mesa mPersonTable, posiblemente agrupados por género, se pueden definir los siguientes URI:

PERSON 
PERSON/# 
PERSON/GENDER 

Al consultar, cambiar entre sus consultas para que pueda agregar a su grupo por el parámetro:

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

de hecho, usted podría pasar cualquier tipo de parámetros a la consulta

Obs .: Utilice un UriMatcher para que coincida con el URI con su implementación de consulta.

+1

Esto es realmente un gran trabajo en todo, apesar de que requiere el proveedor de contenidos para apoyarlo! ¡Gracias! – dbm

+0

Sí, por supuesto! De nada. – JPMagalhaes

+0

@JPMagalhaes: Por favor, ayúdenme. Estoy haciendo lo mismo, pero no obtengo cómo obtener ese implemento. ¿Puedes por favor poner un poco más de código sobre cómo cambiarlo? –

2

Al parecer (y esto es un poco embarazoso) la primera línea en el documentation establece claramente que el CursorLoader consulta el ContentResolver para recuperar el Cursor . Si bien el ContentResolver no expone ningún medio a GROUP BY, por lo tanto, de ninguna manera el CursorLoader podría exponer dicha funcionalidad.

Así que la respuesta aparente a mi propia pregunta es: ¡No puede!

6

Puede añadir Grupo de con la selección de parámetros

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

Estoy marcando esto como útil porque parece ser la única respuesta que funciona con los proveedores de contenido existentes (no se puede agregar un uri para el grupo) Pero es un poco aterrador que funcione. –