2012-03-27 11 views
12

Czy istnieje sposób ograniczenia liczby wierszy zwróconych przez dostawcę treści? Znalazłem to solution, jednak to nie działało dla mnie. Wszystkie wiersze są nadal zwracane.Jak dodać klauzulę limitu za pomocą dostawcy treści?

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

Po prostu pomysł. Ale możesz spróbować umieścić klauzulę limitu jako ostatni parametr. Tak jak w przypadku activity.managedQuery (playlistUri, null, null, null, "limit 3")? – Renard

Odpowiedz

33

Miałem ten problem i musiałem złamać mi głowę, aż w końcu zorientowałem się, czy raczej dostałem whay, który pracował dla mnie. Wypróbuj następujący

Ostatni parametr dotyczy sortOrder. Podałem kolejność sortowania i dodałem do tego LIMIT. Upewnij się, że prawidłowo podałeś spacje. Musiałem sprawdzić powstające zapytanie i wydawało się, że działa.

+6

Czy "ASC LIMIT 2" nie działa? –

+0

Nie działa, jeśli wymagane są ostatnie 2 wiersze w kolejności asc. pobierze pierwsze dwa wiersze – ozmank

+0

Aby uzyskać lepsze podejście, zobacz [tutaj] (http://stackoverflow.com/a/24055457/313113) – bitek

2

Dostawca treści powinien z zasady zwrócić uwagę na parametr graniczny. Niestety, nie jest on powszechnie stosowany.

Na przykład, pisząc dostawca treści do obsługi zapytań SearchManager:

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

W przypadku gdy nie jest realizowany tylko można spaść z powrotem na brzydkie opcją klejenia limit klauzuli sortowania.

2

Niestety, obiekt ContentResolver nie może wysyłać zapytań o argument ograniczenia. W twoim ContentProvider twój MySQLQueryBuilder może zapytać o dodanie dodatkowego parametru limitu.

Po agendzie możemy dodać dodatkową regułę URI do 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); 
} 

Następnie w metodzie zapytania

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

Zapytania ContentProvider z działalności.

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