2012-09-18 11 views
19

Sto provando a interrogare i dati da sqlite db tramite CursorLoader. Quando passo attraverso la documentazione nel sito web di sviluppatori Android, non riesco a trovare la query di limite.Limita la query in CursorLoader

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

Come posso implementare limite in CursorLoader?

Grazie in anticipo

risposta

28

Il modo hacker:

String sortOrder = "ROWID LIMIT 5" 

che si tradurrà in ORDER BY ROWID LIMIT 5. ROWID ordinerebbe per gli ID di riga impliciti che mantiene SQLite, molto vicino a ciò che accade quando non si specifica alcun tipo di ordinamento. Non che ciò stia abusando del fatto che il parametro dell'ordine non controlla se il valore fornito è solo un tipo di ordine valido. Tipo di un attacco di overflow del buffer.

Un modo migliore sarebbe definire i parametri 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"); 

Entrambi gli approcci funzionano solo se il ContentProvider è compatibile con i tentativi di cui sopra per limitare. Non esiste in realtà un modo ben definito per limitare o selezionare determinati dati da uno ContentProvider. Ogni ContentProvider viene fornito con il proprio contratto, pertanto in precedenza non funzionerà con tutti i provider.

1

È possibile utilizzare metodi SQLiteQueryBuilder cui fornisce capacità di avere LIMIT clausola. Oppure puoi semplicemente aggiungere LIMIT alla tua stringa di selezione.
Inoltre, c'è un'opzione per fornire il limite tramite uri (come parte di esso) e gestirlo nel ContentProvider.
Sembra che CursorLoader non stia fornendo alcuna API per il momento.

0

Mi rendo conto che è in ritardo, ma sandrstar mi ha dato un'idea che era di usare l'Uri che si passa nella ContentProvider e aggiungere il limite come l'ultimo segmento del tracciato ad esso utilizzando

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

Poi dentro la tua fornitore di contenuti, nella vostra matcher URI assicurarsi di abbinare

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

Poi nella query, verificare la matchInt che abbinato l'URI da e per ottenere l'ultimo segmento di percorso

uri.getLastPathSegment(); 

Quale sarà il tuo limite e quindi utilizzare ciò che sandrstar ha consigliato con SQLiteQueryBuilder.

Ho solo immaginato che sarebbe bello avere una buona tecnica per ottenere il parametro dal provider. Spero che questo ti aiuti!

Problemi correlati