2012-09-18 29 views
19

Estoy tratando de consultar datos desde sqlite db a través de CursorLoader. Cuando reviso la documentación en el sitio web de desarrolladores de Android, no puedo encontrar la consulta de límite.Limite la consulta en CursorLoader

CursorLoader(Context context, Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

¿Cómo puedo aplicar límite en CursorLoader?

Gracias de antemano

Respuesta

28

La forma hacker:

String sortOrder = "ROWID LIMIT 5" 

que se traducirá en ORDER BY ROWID LIMIT 5. ROWID ordenaría por los identificadores de fila implícitos que SQLite mantiene, muy cerca de lo que sucede cuando no se especifica una ordenación oder en absoluto. No es que esto esté abusando del hecho de que el parámetro de orden no verifica si el valor suministrado es solo un tipo de orden válido. Tipo de ataque de desbordamiento de búfer.

Una mejor manera sería definir los parámetros Uri.

// query code 
Uri queryUri = Uri.parse("content://what/ever/items"); 
queryUri = queryUri.buildUpon().appendQueryParameter("limit", "5").build(); 

// in ContentProvider 
String limit = queryUri.getQueryParameter("limit"); 

Ambos enfoques sólo funcionará si el ContentProvider es compatible con los intentos anteriores para limitar. En realidad, no existe una forma bien definida de limitar o seleccionar ciertos datos de un ContentProvider. Cada ContentProvider viene con su propio contrato, por lo que lo anterior no funcionará con todos los proveedores.

1

Se pueden utilizar métodos SQLiteQueryBuilder cuya proporciona capacidad de tener LIMIT cláusula. O Puede simplemente anexar LIMIT a la cadena de selección de Agradecimiento.
Además, hay una opción para proporcionar límite a través de uri (como parte de él) y manejarlo en su ContentProvider.
Parece que CursorLoader no proporciona ningún API para él actualmente.

0

me di cuenta que es tarde, pero sandrstar me dio una idea que era utilizar el URI que se pasa en el ContentProvider y anexar el límite como el último segmento de la ruta a él utilizando

Uri.withAppendedPath("uri" "/" + limitNumber); 

A continuación, dentro de su proveedor de contenido, en su matcher URI asegurarse de que coinciden con

MATCHER.addURI("authority", "uri" + "/#", matchInt); 

Luego, en la consulta, comprobar la matchInt que se correspondía con el URI para el segmento y obtener la última ruta

uri.getLastPathSegment(); 

Cuál será su límite y luego use lo que sandrstar recomienda con SQLiteQueryBuilder.

Simplemente pensé que sería bueno tener una buena técnica para obtener su parámetro para el proveedor. ¡Espero que esto ayude!

Cuestiones relacionadas