2015-06-24 2 views
5

Я работаю с поисковой структурой и здесь. Я получаю строку запроса и делаю запрос из преобразователя контента, но проблема в том, что я не могу ограничить результаты. Нашли несколько решений, но они не работают для меня.Android SearchRecentSuggestionsProvider limit limit

Мой контент-провайдер расширяет SearchRecentSuggestionsProvider и объявленный в манифесте, здесь запрос URI Uri URI = Uri.parse("content://" + AUTHORITY + "/search_suggest_query");

Золь 1: добавление параметра запроса к Uri

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

золя 2: добавления предела in sortOrder параметр запроса

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

В обоих случаях запрос возвращает все строки из предложений поиска. Кто-нибудь знает, как ограничить такой запрос?

+2

параметр SUGGEST_PARAMETER_LIMIT запроса добавлен к внушению запросов, чтобы ограничить количество предложений, возвращенных. ** Этот предел является только рекомендательным, и предлагающие провайдеры могут предпочесть игнорировать его **. – pskink

+0

Существует лучшее решение, совершенно по-другому, я добавил ответ ниже –

ответ

4

Ниже приведен метод запроса в базовом классе SearchRecentSuggestionsProvider в рамках

/** 
    * 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) { 

Потенциально вы можете заменить его и осуществить предельный - но как вы можете видеть комментарий выше ясно государств «не отменяют» , В существующем методе не применяется ограничение.

Однако я вижу в некоторых других ответах на переполнение стека и другие сайты, которые люди переопределяют.

Пример: Use SearchRecentSuggestionsProvider with some predefined terms?

Исходя из этого, я думаю, вы можете попробовать его - переопределить метод запроса и добавить собственную реализацию, которая поддерживает ограничивающую результаты. Разберите SearchManager.SUGGEST_PARAMETER_LIMIT, который вы использовали в методе запроса, и используйте его для ограничения возвращаемых результатов.

+1

«используйте этот предел при фактическом запросе базы данных или независимо от источника данных». Этот вопрос связан конкретно с SearchRecentSuggestionsProvider. Пожалуйста, будьте более конкретными в том, как переопределить 'query' для этого случая. – lf215

+1

Извините, я неправильно понял вопрос. Добавлены более конкретные детали. – RocketRandom

+0

Существует лучшее решение совершенно по-другому, я добавил ответ ниже –

2

Собственно, мы искали не то место. После всех этих исследований, наконец, я нашел трюк.

На экране результатов (Где мы сохранить запрос для поиска SearchRecentSuggestions) мы называем этот метод

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

SearchRecentSuggestions был ответственен, чтобы сохранить этот запрос поставщику контента.

Этот класс имеет защищенный метод, называемый truncateHistory() с этой документацией

уменьшает длину таблицы истории, чтобы предотвратить его от растущих слишком большой.

Таким образом, решение - это просто создать собственный класс, переопределить этот метод и вызвать супер-реализацию с требуемым лимитом.

Вот пример

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

, если я правильно понял, что ограничит весь размер таблицы, но то, что я спрашивал, - как ограничить количество строк запроса? или ваше решение не повлияет на размер таблицы? – greenfrvr

+0

Да, это влияет на размер таблицы, но при этом сохраняет последние 5 последних. Уменьшение размера таблицы до 5 повлияет на строки запроса. Но если вы хотите иметь такой вариант, как показать больше запросов к истории, это вам не поможет. –