2012-03-27 5 views
12

Gibt es eine Möglichkeit, die Anzahl der vom Inhaltsanbieter zurückgegebenen Zeilen zu begrenzen? Ich fand diese solution, aber es hat nicht für mich funktioniert. Alle Zeilen werden noch zurückgegeben.So fügen Sie eine Limitklausel mithilfe des Content Providers hinzu

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

Nur eine Idee. Sie können jedoch versuchen, die Limit-Klausel als letzten Parameter zu setzen. Wie so activity.managedQuery (playlistUri, null, null, null, "limit 3")? – Renard

Antwort

33

Ich habe dieses Problem hatte und den Kopf zu zerbrechen, bis ich es endlich herausgefunden, oder bekam vielmehr eine whay der für mich gearbeitet. Versuchen Sie Folgendes

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

Der letzte Parameter ist für SortOrder. Ich habe die Sortierreihenfolge angegeben und auch die LIMIT hinzugefügt. Stellen Sie sicher, dass Sie die Räume richtig angeben. Ich musste die Abfrage überprüfen, die gerade erstellt wurde und das schien zu funktionieren.

+6

Funktioniert "ASC LIMIT 2" nicht? –

+0

Funktioniert nicht, wenn die letzten 2 Zeilen in Asc-Reihenfolge benötigt werden. es wird die ersten beiden Zeilen holen – ozmank

+0

Für einen besseren Ansatz siehe [hier] (http://stackoverflow.com/a/24055457/313113) – bitek

2

Ein Content-Provider sollte grundsätzlich auf einen Limit-Parameter achten. Leider ist es nicht allgemein implementiert.

Zum Beispiel, wenn ein Content-Provider schreiben Search Anfragen bearbeiten:

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

Wo es nicht implementiert ist nur wieder auf die hässliche Option fallen kann eine Grenze für die Art Klausel des Klebens.

2

Leider kann ContentResolver keine Abfrage mit Limit-Argument haben. In Ihrem ContentProvider kann Ihr MySQLQueryBuilder das Hinzufügen des zusätzlichen Limit-Parameters abfragen.

Nach der Agenda können wir eine zusätzliche URI-Regel in ContentProvider hinzufügen.

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

Dann in Ihrer Anfrage Methode

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

Querying Contentprovider von Aktivität.

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