Android SearchRecentSuggestionsProvider查询限制

时间:2015-06-24 07:40:30

标签: android android-contentprovider

我正在使用搜索建议框架,就是这样。我得到一些查询字符串并从内容解析器进行查询,但问题是我无法限制结果。找到了几个解决方案,但它们对我不起作用。

我的内容提供商正在扩展SearchRecentSuggestionsProvider并在manifest中声明,这里查询uri SearchSuggestionProvider.URI.buildUpon().appendQueryParameter(SearchManager.SUGGEST_PARAMETER_LIMIT, String.valueOf(5)).build()

sol 1: 将查询参数添加到uri

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

sol 2: 在sortOrder查询参数中添加限制

ActivityInfo

在这两种情况下,查询都会从搜索建议中返回所有行。有谁知道如何限制这样的查询?

2 个答案:

答案 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 :(得分:3)

实际上,我们在错误的地方搜索。 经过所有这些调查后,我终于找到了诀窍。

在结果屏幕上(我们将查询保存到搜索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);
    }
}