2012-03-27 8 views
12

C'è un modo per limitare il numero di righe restituite dal provider di contenuti? Ho trovato questo solution, tuttavia, non ha funzionato per me. Tutte le righe vengono ancora restituite.Come aggiungere la clausola limite utilizzando il provider di contenuti

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 un'idea. Ma puoi provare a mettere la clausola limite come ultimo parametro. Mi piace così activity.managedQuery (playlistUri, null, null, null, "limite 3")? – Renard

risposta

33

Ho avuto questo problema e ha dovuto rompere la testa fino alla fine ho capito, o meglio, ho un whay che ha lavorato per me. Prova il seguente

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

L'ultimo parametro è per sortOrder. Ho fornito l'ordinamento e ho aggiunto anche il LIMIT. Assicurati di dare gli spazi correttamente. Dovevo controllare la query che si stava formando e questo sembrava funzionare.

+6

"ASC LIMIT 2" non funzionerà? –

+0

Non funziona se sono richieste le ultime 2 righe in ordine asc. recupererà le prime due righe – ozmank

+0

Per un approccio migliore, consultare [qui] (http://stackoverflow.com/a/24055457/313113) – bitek

2

Un fornitore di contenuti dovrebbe, in generale, prestare attenzione a un parametro limite. Sfortunatamente, non è implementato universalmente.

Per esempio, quando si scrive un fornitore di contenuti per gestire le query SearchManager:

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

Dove non è implementata si può che ricadere sul brutto possibilità di incollare un limite alla clausola di sorta.

2

Sfortunatamente, ContentResolver non può eseguire query con argomento limite. All'interno di ContentProvider, MySQLQueryBuilder può richiedere l'aggiunta del parametro limite aggiuntivo.

In seguito all'ordine del giorno, è possibile aggiungere una regola URI aggiuntiva all'interno di 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); 
} 

Poi, nel tuo metodo di interrogazione

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); 

Interrogazione ContentProvider dall'attività.

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"));