2012-09-18 29 views
19

Próbuję kwerendy danych z sqlite db przez CursorLoader. Kiedy przeglądam dokumentację na stronie programisty Androida, nie mogę znaleźć zapytania o limit.Ograniczanie zapytania w CursorLoader

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

Jak mogę wdrożyć limitu w CursorLoader?

Dzięki z gory

Odpowiedz

28

hackish sposób:

String sortOrder = "ROWID LIMIT 5" 

co spowoduje ORDER BY ROWID LIMIT 5. ROWID sortowałby według ukrytych identyfikatorów wiersza przechowywanych przez SQLite - bardzo zbliżony do tego, co dzieje się, gdy nie określa się wcale sortowania. Nie oznacza to nadużycia faktu, że parametr zamówienia nie sprawdza, czy podana wartość jest tylko prawidłowym typem zamówienia. Rodzaj ataku przepełnienia bufora.

Lepszym sposobem byłoby zdefiniowanie parametrów 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"); 

Oba podejścia będzie działać tylko wtedy, gdy ContentProvider jest kompatybilny z powyższych prób ograniczenia. Nie ma właściwie zdefiniowanego sposobu ograniczenia lub wybrania pewnych danych z ContentProvider. Każda wersja ContentProvider pochodzi z własnej umowy, więc wyżej nie będzie działać z każdym dostawcą.

1

Można użyć SQLiteQueryBuilder metod których przewiduje możliwość posiadania LIMIT klauzuli. Lub Możesz po prostu dołączyć LIMIT do Twojego łańcucha wyboru.
Istnieje również opcja ograniczenia limitu za pomocą uri (jako część) i obsługiwać go w swoim dostawcy treści.
Wygląda na to, że CursorLoader nie udostępnia obecnie żadnego interfejsu API.

0

Zdaję sobie sprawę, jest to późno, ale sandrstar dał mi pomysł, który był w użyciu URI, które przechodzą do ContentProvider i dołączyć granicę jako ostatni segment ścieżki do niego przy użyciu

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

Następnie wewnątrz dostawca treści, w dopasowującego URI upewnij się dopasować

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

Następnie w zapytaniu należy sprawdzić, czy matchInt że dopasowane do URI, ostatni segment ścieżki

uri.getLastPathSegment(); 

Jaki będzie twój limit, a następnie użyj tego, co poleca sandrstar w SQLiteQueryBuilder.

Pomyślałem, że może być miło mieć dobrą technikę, aby wprowadzić parametr do dostawcy. Mam nadzieję że to pomoże!