2011-09-29 27 views
7

Estoy buscando la implementación de CursorLoader en mi aplicación, pero tengo un pequeño problema que parece que no hay una forma de pasar una consulta sin procesar al constructor de CursorLoader.CursorLoader with rawQuery

Tal vez me falta algo en la documentación (y en google), así que si alguien puede indicarme una forma simple de ejecutar una consulta en bruto con una clase CursorLoader, lo agradecería. De lo contrario, tendré que probablemente crear mi propia clase CursorLoader con la funcionalidad necesaria, que estoy tratando de evitar.

Respuesta

8

Parece que no hay una forma de pasar una consulta sin procesar al constructor de CursorLoader.

Esto es porque CursorLoader funciona con proveedores de contenido y los proveedores de contenido no son compatibles con rawQuery().

así que si alguien puede indicarme una forma simple de ejecutar una consulta en bruto con una clase CursorLoader, lo agradecería.

Eso es imposible, lo siento. Le invitamos a crear su propio AsyncTaskLoader que llegue a una base de datos SQLite y sea compatible con rawQuery(). De hecho, probablemente escribiré uno de estos más adelante este año, si no veo a dónde me han golpeado.

+0

Este sería un buen comienzo: http://stackoverflow.com/questions/7182485/usage-cursorloader-without-contentprovider –

+0

No estoy seguro de que esto es completamente cierto, y puede que me han causado 2 días de pistas falsas Tengo una rawQuery en mi SQLiteOpenHelper donde tengo todas mis consultas reales. Lo llamo desde un proveedor de contenido iniciado por un cargador de cursor y parece funcionar bien. – kpierce8

+0

@ kpierce8: OP intentaba pasar una "consulta cruda" a 'CursorLoader', que no es estrictamente compatible. El OP no discutió la * implementación * de un 'ContentProvider', que es donde está usando' SQLiteOpenHelper' y 'rawQuery()'. Ahora, es posible que alguien implemente un 'ContentProvider' donde se pasó una" consulta cruda ", por ejemplo, el 3er parámetro a' query() ', en lugar de una simple cláusula' WHERE' (o equivalente). Y, para ese 'ContentProvider 'específico, podría pasar una" consulta sin procesar "a' CursorLoader'. Sin embargo, ese no es un enfoque típico. – CommonsWare

7

consulta crudo no es directamente compatible, pero se puede hacer un truco sucio: desde su llamada código getContentResolver().query(RAWQUERY_CONTENT_URI, null, rawquery, args, null); e implementar proveedor de contenido como

@Override 
public synchronized Cursor query(Uri uri, String[] projection, String selection, 
     String[] selectionArgs, String sortOrder) 
{ 
    int uriType = sURIMatcher.match(uri); 
    switch (uriType) 
    { 
     case RAW_QUERY: 
     return dbHelper.getReadableDatabase().rawQuery(selection, selectionArgs); 
    } 
[...] 
} 
+0

¿Cómo puedo escribir un contenido Uri si necesito acceder a dos tablas para la consulta Raw uri. –

1

** Para Búsqueda personalizada utilizando proveedor de contenido **

Cambiar el cursor del cargador como sigue (en onCreateLoader)

return new CursorLoader(
     getActivity(),      // Context 
     PRODUCT.CONTENT_URI,     // URI 
     PROJECTION,       // Projection 
     PRODUCT.PRODUCT_NAME+ " like ?",  // Selection 
     new String[]{"%" + mCurFilter + "%"}, // Selection args 
     PRODUCT.PRODUCT_NAME + " asc"); 

en su Proveedor de Chan En consecuencia ge

//C is Cursor object 
switch (uriMatch) { 
     case ROUTE_PRODUCT_ID: 
      // Return a single entry, by ID. 
      String id = uri.getLastPathSegment(); 
      builder.where(PRODUCT._ID + "=?", id); 
      c = builder.query(db, projection, sortOrder); 
      assert ctx != null; 
      c.setNotificationUri(ctx.getContentResolver(), uri); 
      return c; 
//   break; 
     case ROUTE_PRODUCT: 
      // Return all known entries. 
      builder.table(PRODUCT.PRODUCT_TABLE_NAME) 
      .where(selection, selectionArgs); 
      c = builder.query(db, projection, sortOrder); 
      assert ctx != null; 
      c.setNotificationUri(ctx.getContentResolver(), uri); 
      return c;