2015-06-24 14 views
5

Sto lavorando con il quadro di suggerimenti di ricerca e qui è il caso. Ottengo una stringa di query e faccio una query dal content resolver, ma il problema è che non posso limitare i risultati. Ho trovato diverse soluzioni ma non funzionano per me.Android SearchRecentSuggestionsProvider limite di query

mio fornitore di contenuti si sta estendendo SearchRecentSuggestionsProvider e dichiarato nel manifesto, qui di query URI Uri URI = Uri.parse("content://" + AUTHORITY + "/search_suggest_query");

sol 1: aggiungendo parametro di query a Uri

SearchSuggestionProvider.URI.buildUpon().appendQueryParameter(SearchManager.SUGGEST_PARAMETER_LIMIT, String.valueOf(5)).build()

sol 2: limite aggiungendo nel parametro di query sortOrder

getContentResolver().query(URI, null, "?", new String[]{searchQuery}, "_id asc limit 5");

In entrambi i casi la query restituisce tutte le righe dai suggerimenti di ricerca. Qualcuno sa come limitare una tale query?

+2

parametro SUGGEST_PARAMETER_LIMIT Query aggiunto alla query suggerimento di limitare il numero di suggerimenti restituiti. ** Questo limite è solo di consulenza e i fornitori di suggerimenti possono scegliere di ignorarlo **. – pskink

+0

C'è una soluzione migliore, un modo completamente diverso, ho aggiunto la risposta sotto –

risposta

4

Di seguito è il metodo query nel SearchRecentSuggestionsProvider classe di base nel quadro

/** 
    * This method is provided for use by the ContentResolver. Do not override, or directly 
    * call from your own code. 
    */ 
    // TODO: Confirm no injection attacks here, or rewrite. 
    @Override 
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, 
      String sortOrder) { 

Potenzialmente è possibile ignorare e implementare la limitazione - ma come si può vedere il commento di cui sopra afferma chiaramente "non ignorare" . Nel metodo esistente non viene applicata alcuna limitazione.

Tuttavia, in alcune delle altre risposte sullo stack overflow e su altri siti le persone lo ignorano.

Esempio: Use SearchRecentSuggestionsProvider with some predefined terms?

Sulla base di questo penso che si può provare - l'override del metodo query e aggiungere la tua implementazione che supporta limitare i risultati. Analizzare lo SearchManager.SUGGEST_PARAMETER_LIMIT che si è utilizzato nel metodo di query e utilizzarlo per limitare i risultati restituiti.

+1

"utilizzare questo limite quando si esegue effettivamente una query sul database o qualsiasi altra origine dati" Questa domanda è correlata a SearchRecentSuggestionsProvider in particolare. Si prega di essere più specifici su come sovrascrivere 'query' per questo caso. – lf215

+1

Mi dispiace, ho inizialmente frainteso la domanda. Aggiunti ora dettagli più specifici. – RocketRandom

+0

C'è una soluzione migliore in un modo completamente diverso, ho aggiunto la risposta sotto –

2

In realtà, stavamo cercando nel posto sbagliato. Dopo tutte queste indagini, finalmente ho trovato il trucco.

Nella schermata dei risultati (Dove siamo salvare la query ai SearchRecentSuggestions di ricerca) si chiama questo metodo

SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this, 
        SearchSuggestionProvider.AUTHORITY, SearchSuggestionProvider.MODE); 
suggestions.saveRecentQuery(query, null); 

SearchRecentSuggestions era il responsabile per salvare questa query al fornitore di contenuti.

Questa classe ha un metodo protetto chiamato truncateHistory() con questa documentazione

riduce la lunghezza della tavola storia, per evitare che si cresce troppo grande.

Quindi la soluzione è semplice, creare una classe personalizzata, sovrascrivere questo metodo e chiamare la super implementazione con il limite richiesto.

Ecco l'esempio

public class SearchRecentSuggestionsLimited extends SearchRecentSuggestions { 

    private int limit; 

    public SearchRecentSuggestionsLimited(Context context, String authority, int mode, int limit) { 
     super(context, authority, mode); 
     this.limit = limit; 
    } 

    @Override 
    protected void truncateHistory(ContentResolver cr, int maxEntries) { 
     super.truncateHistory(cr, limit); 
    } 
} 
+0

se ho capito bene, che limiterà l'intera dimensione della tabella, ma quello che stavo chiedendo è come limitare l'importo delle righe della query? o la tua soluzione non influenzerà le dimensioni della tabella? – greenfrvr

+0

Sì, influisce sulla dimensione della tabella, ma conserva ancora i primi 5 recenti. Riducendo la dimensione della tabella a 5 si influirà sulle righe della query. Ma se vuoi avere un'opzione come mostrare più query di cronologia, questo non ti aiuterà. –

Problemi correlati