Android SearchRecentSuggestionsProvider查询限制

Android SearchRecentSuggestionsProvider查询限制,android,android-contentprovider,Android,Android Contentprovider,我正在使用搜索建议框架,下面就是这个例子。我从内容解析器中获取一些查询字符串并进行查询,但问题是我无法限制结果。找到了几种解决方案,但它们对我不起作用 我的内容提供程序正在扩展SearchRecentSuggestionsProvider,并在清单中声明,此处为查询uri Uri=Uri.parse(“content://“+AUTHORITY+”/search\u suggest\u query”) 解决方案1: 向uri添加查询参数 SearchSuggestionProvider.URI

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

我的内容提供程序正在扩展SearchRecentSuggestionsProvider,并在清单中声明,此处为查询uri
Uri=Uri.parse(“content://“+AUTHORITY+”/search\u suggest\u query”)

解决方案1: 向uri添加查询参数

SearchSuggestionProvider.URI.buildOn().appendQueryParameter(SearchManager.SUGGEST\u PARAMETER\u LIMIT,String.valueOf(5)).build()

解决方案2: 在sortOrder查询参数中添加限制

getContentResolver()


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

下面是框架中基类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) {
您可能会覆盖它并实现限制,但正如您可以看到上面的注释所示,它明确表示“不要覆盖”。 在现有方法中,没有强制执行任何限制

然而,我在关于堆栈溢出和其他站点的一些其他答案中看到,人们确实覆盖了它

例如:


基于此,我认为您可以尝试一下——覆盖查询方法并添加您自己的实现,该实现支持限制结果。分析SearchManager。建议您在查询方法中使用的参数限制,并使用它限制返回的结果。

实际上,我们在错误的位置搜索。 经过这么多的调查,我终于找到了窍门

在结果屏幕(我们将查询保存到SearchRecentSuggestions)上,我们称此方法

SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this,
                    SearchSuggestionProvider.AUTHORITY, SearchSuggestionProvider.MODE);
suggestions.saveRecentQuery(query, null);
负责将此查询保存到内容提供商

此类有一个受保护的方法,名为
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);
    }
}

建议\参数\添加到建议查询中的限制查询参数,用于限制返回的建议数量。这个限制只是建议,建议提供商可能会选择忽略它。有一个更好的解决方案,完全不同的方式,我在下面添加了答案“在实际查询数据库或任何数据源时使用这个限制”。这个问题与SearchRecentSuggestionsProvider特别相关。对于这种情况,请更具体地说明如何覆盖
查询
。很抱歉,我最初误解了这个问题。现在添加了更具体的细节。有一个完全不同的解决方案,我添加了下面的答案如果我理解正确,这将限制整个表的大小,但我要问的是如何限制查询行的数量?或者您的解决方案不会影响表的大小?是的,它会影响表的大小,但仍会保存前5名。通过将表大小减少到5,将影响查询行。但是,如果您想有一个类似“显示更多历史查询”的选项,这对您没有帮助。