2012-03-27 4 views
12

¿Hay alguna manera de limitar el número de filas devueltas desde el proveedor de contenido? Encontré esto solution, sin embargo, no funcionó para mí. Todas las filas siguen siendo devueltas.Cómo agregar la cláusula de límite utilizando el proveedor de contenido

Uri uri = Playlists.createIdUri(playlistId); //generates URI 
uri = uri.buildUpon().appendQueryParameter("limit", "3").build();  
Cursor cursor = activity.managedQuery(playlistUri, null, null, null, null); 
+0

Solo una idea. Pero puedes intentar poner la cláusula de límite como el último parámetro. Al igual que actividad.managedQuery (lista de reproducciónUri, nulo, nulo, nulo, "límite 3")? – Renard

Respuesta

33

he tenido este problema y tuvo que romper la cabeza hasta que finalmente lo descubrí, o mejor dicho, tengo una whay que trabajó para mí. Intente lo siguiente

Cursor cursor = activity.managedQuery(playlistUri, null, null, null, " ASC "+" LIMIT 2"); 

El último parámetro es para sortOrder. Proporcioné el orden de clasificación y también le agregué el LÍMITE. Asegúrate de dar los espacios correctamente. Tuve que verificar la consulta que se estaba formando y esto pareció funcionar.

+6

¿No funcionará "ASC LIMIT 2"? –

+0

No funcionará si se requieren las últimas 2 filas en orden asc. obtendrá las dos primeras filas – ozmank

+0

Para una mejor aproximación, consulte [aquí] (http://stackoverflow.com/a/24055457/313113) – bitek

2

En general, un proveedor de contenido debe prestar atención a un parámetro de límite. Lamentablemente, no se implementa de forma universal.

Por ejemplo, al escribir un proveedor de contenido para manejar SearchManager consultas:

String limit = uri.getQueryParameter(SearchManager.SUGGEST_PARAMETER_LIMIT); 

Cuando no se implementa sólo se puede recurrir a la opción fea de pegar un límite en la cláusula tipo.

2

Desafortunadamente, ContentResolver no puede realizar consultas teniendo un argumento de límite. Dentro de su ContentProvider, su MySQLQueryBuilder puede consultar agregando el parámetro de límite adicional.

Siguiendo la agenda, podemos agregar una regla de URI adicional dentro de ContentProvider.

static final int ELEMENTS_LIMIT = 5; 
public static final UriMatcher uriMatcher; 

static { 
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); 
........ 
uriMatcher.addURI(AUTHORITY, "elements/limit/#", ELEMENTS_LIMIT); 
} 

Luego, en el método de consulta

String limit = null; //default.... 
    switch(uriMatcher.match(uri)){ 
     ....... 
       case ELEMENTS_LIMIT: 
        limit = uri.getPathSegments().get(2); 
       break; 
     ...... 

      } 

return mySQLBuilder.query(db, projection, selection, selectionArgs, null, null, sortOrder, limit); 

Consulta ContentProvider de actividad.

uri = Uri.parse("content://" + ContentProvider.AUTHORITY + "/elements/limit/" + 1); 

//In My case I want to sort and get the greatest value in an X column. So having the column sorted and limiting to 1 works. 
    Cursor query = resolver.query(uri, 
         new String[]{YOUR_COLUMNS}, 
         null, 
         null, 
         (X_COLUMN + " desc")); 
Cuestiones relacionadas