Agrupar por en ContentResolver en Ice Cream Sandwich

Estoy haciendo una consulta en los contactos de Android ContentProvider. Necesito una cláusula Group By. En Pan de jengibre y Honeycomb, hago algo como esto para buscar números de teléfono y correos electrónicos al mismo tiempo:

(La cláusula WHERE real es mucho más complicada, ya que incluye tipos de cheques.Esto es una simplificación, pero da el mismo resultado)

String request = Phone.NUMBER + " LIKE ? OR " + Email.DATA + " LIKE ?"; String[] params = new String["%test%", "%test%"]; Cursor cursor = getContentResolver().query( Data.CONTENT_URI, new String[] { Data._ID, Data.RAW_CONTACT_ID }, request + ") GROUP BY (" + Data.RAW_CONTACT_ID, params, "lower(" + Data.DISPLAY_NAME + ") ASC"); 

La inyección del ')' termina la cláusula WHERE y permite la inserción de una cláusula GROUP BY.

Sin embargo, en Ice Cream Sandwich, parece que el ContentProvider detecta esto y agrega el número correcto de paréntesis para prevenir mi inyección. Cualquier otra forma de hacerlo en una sola consulta de cursor?

Editar

Actualmente, he eliminado el GROUP BY, y agregado un MatrixCursor para limitar el impacto, pero prefiero tener un cursor real:

 MatrixCursor result = new MatrixCursor(new String[] { Data._ID, Data.RAW_CONTACT_ID }); Set<Long> seen = new HashSet<Long>(); while (cursor.moveToNext()) { long raw = cursor.getLong(1); if (!seen.contains(raw)) { seen.add(raw); result.addRow(new Object[] {cursor.getLong(0), raw}); } } 

Puede crear un Uri personalizado tal que cuando su UriMatcher en su ContentProvider consiga, puede insertar su cláusula group by y luego ejecutar el raw sql directamente en la base de datos.

Primero de todas las excusa mi Inglés POBRE! Soy nuevo en Java / Android, comenzó con 4.2.1 y luchar con eso casi 2 días, entonces empiezo a leer algunos detalles más sobre SQLiteQueryBuilder la parte de la consulta es más o menos lo que u está buscando;)

Tiene:

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

La "función" de consulta del proveedor de contenido sólo le proporciona:

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

Aquí u puede trucos alrededor, voy a publicar mi código recorte:

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

¡eso es!

Aquí el código que uso para ejecutar:

  Cursor showsc = getContext().getContentResolver().query( WhatsOnTVProvider.CONTENT_EPISODES_NEXT_URI, EpisodenTable.allColums_inclCount, String.valueOf(Calendar.getInstance().getTimeInMillis() / 1000) + " < date", null, null); 
  • La consulta ContentResolver está lanzando una excepción nullpointerException
  • ¿Cómo obtener el tamaño de los datos recibidos a través de EXTRA_STREAM en una aplicación que maneja la acción enviar intención?
  • ¿Error de eliminación o éxito de ContentProviderResult ?
  • ¿Error al insertar datos en Proveedor de contenido propio?
  • Android Contentprovider - actualización dentro de un método de inserción
  • ¿Cuál es la diferencia entre contentprovider y contentResolver en android
  • Android - Uso de DAO de ORMLite como ContentProvider
  • ¿Cómo evaluar la eficiencia de ContentProviders en Android?
  • Insertar varias filas con ContentProvider
  • ¿Es una buena práctica usar rawQuery en ContentProvider?
  • ¿Cómo permitir a los usuarios ver y reproducir canciones en Android a las que ya tienen acceso (por ejemplo, a través de Google Play)?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.