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:
- http://laviefrugale.blogspot.com/2012/01/using-limit-with-android-contentprovider.html
- http://www.sqlite.org/lang_select.html
- https://.com/a/12476458/1523910 + @ la respuesta de eocanha