proveedores proveedor nativos hacer ejemplos definicion contentresolver content contenido android android-contentprovider

android - nativos - proveedor de contenido ejemplos



Especificación de límite/desplazamiento para consultas de ContentProvider (4)

Cuando intenté usar la Cadena de límite [ver Cadena de límite a continuación] usando lo siguiente:

StringBuilder sbLimit = new StringBuilder().append(" ").append(i_offset).append(" , ").append(i_limit); String limit = sbLimit .toString()

Esto me dio buenos resultados en combinación con las consultas de selección, clasificación y agrupación.

Estoy intentando que mi ContentResolver ejecute esta consulta:

select * from myTable limit 1 offset 2

El único método de consulta en ContentResolver es:

resolver.query(uri, projection, selection, selectionArgs, sortOrder);

He intentado:

final Cursor c = resolver.query( MyTable.CONTENT_URI, MyTable.PROJECTION, " ? ?", new String[] {"1", "2"}, null);

Lo que acaba de lanzar una IllegaLArgumentException. ¿Cuál es la forma correcta de lograr esto?


Pongo la cláusula de límite como un parámetro de consulta utilizando la sintaxis ''limit = offset , limit '':

Cursor c = context.getContentResolver().query( MyTable.CONTENT_URI.buildUpon().encodedQuery("limit="+offset+","+limit).build(), MyTable.PROJECTION, null, null, null);

Funciona al menos con uris MediaStore. Tenga cuidado de no codificar el "," o no funcionará.


Puse la cláusula LIMIT en el parámetro sordOrder, también he visto lo mismo hecho por otros, pero no estoy seguro de si es correcto al 100%:

final Cursor c = resolver.query( MyTable.CONTENT_URI, MyTable.PROJECTION, null, null, " limit 1 offset 2");


Si está proporcionando su proveedor de contenido, entonces puede usar android.net.Uri.Builder#appendQueryParameter para proporcionar límites y compensaciones como parámetros de consulta, que el proveedor de contenido puede usar mientras construye la consulta.

public class MyProvider extends ContentProvider { public static final String QUERY_PARAMETER_LIMIT = "limit"; public static final String QUERY_PARAMETER_OFFSET = "offset"; public Cursor query(Uri uri, ...) { String limit = uri.getQueryParameter(QUERY_PARAMETER_LIMIT); String offset = uri.getQueryParameter(QUERY_PARAMETER_OFFSET); SQLiteQueryBuilder builder = new SQLiteQueryBuilder(); // set the table name,... // leaving handling of null conditions as an exercise to the reader. String limitString = offset + "," + limit; Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, sortOrder, limitString); //... return c; } }

mientras se construye la consulta:

private static final Uri CONTENT_URI = MyProvider.CONTENT_URI.buildUpon() .appendQueryParameter(MyProvider.QUERY_PARAMETER_LIMIT, String.valueOf(limit)) .appendQueryParameter(MyProvider.QUERY_PARAMETER_OFFSET, String.valueOf(offset)) .build();

tenga en cuenta que el android.net.Uri.Builder#appendQueryParameter codifica el valor para evitar la inyección de SQL.

Referencias:

  1. http://laviefrugale.blogspot.com/2012/01/using-limit-with-android-contentprovider.html
  2. http://www.sqlite.org/lang_select.html
  3. https://.com/a/12476458/1523910 + @ la respuesta de eocanha