2009-07-07 16 views
5

Interfejs API Androida zapewnia czysty mechanizm za pośrednictwem SQLite do wysyłania zapytań do listy kontaktów. Jednak nie jestem pewien, jak ograniczyć wyniki:jak dodać klauzulę limitu do zarządzania kwerendą na Androidzie

Cursor cur = ((Activity)mCtx).managedQuery(
       People.CONTENT_URI, 
       columns, 
       "LIMIT ? OFFSET ?", 
       new String[] { Integer.toString(limit), Integer.toString(offset) }, 
       null 
     ); 

Nie działa.

Odpowiedz

4

Myślę, że musisz zrobić to ręcznie. Obiekt Cursor, który jest zwracany z wywołania managedQuery, nie wykonuje pełnego zapytania od razu. Musisz użyć metody Cursor.move *(), aby przeskoczyć wokół zestawu wyników.

Jeśli chcesz go ograniczyć, utwórz własny limit podczas przeglądania wyników. Jeśli potrzebujesz stronicowania, możesz użyć Cursor.moveToPosition (startIndex) i rozpocząć czytanie od tego miejsca.

4

Masz dostęp do ContentProvider, a nie do SQLite, gdy wyszukujesz kontakty ContentProvider. Interfejs ContentProvider nie obsługuje bezpośrednio klauzuli LIMIT.

Jeśli masz bezpośredni dostęp do własnej bazy danych SQLite, użyj metody rawQuery() na SQLiteDatabase i dodaj klauzulę LIMIT.

10

Faktycznie, w zależności od operatora można dołączyć limit do URI następująco:

uri.buildUpon().appendQueryParameter("limit", "40").build() 

Wiem MediaProvider obsługuje to i patrząc na ostatnim kodzie wydaje można to zrobić ze stykami też.

5

I okazało się, że z this bug Android wykorzystuje następujące regex do analizowania klauzuli LIMIT kwerendy:

Od <framework/base/core/java/android/database/sqlite/SQLiteQueryBuilder.java>

klauzuli LIMIT sprawdza się następujące sLimitPattern.

private static final Pattern sLimitPattern = Pattern.compile("\\s*\\d+\\s*(,\\s*\\d+\\s*)?"); 

Zauważmy, że wyrażenie regularne ma przyjąć format offsetNumber,limitNumber mimo że nie akceptuje bezpośrednio oświadczenie OFFSET.

+0

Dzięki za odpowiedź, która sprawiła, że ​​mój dzień, tydzień i miesiąc! Szukałem jak przekazać parametr "OFFSET" do bazy danych (przez 'ContentProvider') bez konieczności ręcznego wysyłania zapytań do bazy danych (z metodą' rawQuery (...) ') przez wiele tygodni. – dbm

+0

http://www.sqlite.org/lang_select.html (Zwróć uwagę na ostatni akapit na stronie) – dbm

+0

Chciałbym dodać, że jeśli chcesz użyć przesunięcia bez limitu, użyj parametru offsetValue, -1 –

4

można określić parametr „limit” w parametrze „porządek”, może nawet wewnątrz innych parametrów, jeśli nie chcą uporządkować, bo będziesz musiał określić kolumny, aby posortować według następnie:

mContentResolver.query(uri, columnNames, null, null, "id LIMIT 1"); 
+0

I jak ten rodzaj hackowania. – herbertD

+0

to nie działało w wersji 2.3+ – realgt

Powiązane problemy