Android SearchRecentSuggestionsProvider查询限制

gre*_*rvr 5 android android-contentprovider

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

我的内容提供商正在扩展SearchRecentSuggestionsProvider并在manifest中声明,这里查询uri Uri URI = Uri.parse("content://" + AUTHORITY + "/search_suggest_query");

sol 1:向uri添加查询参数

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

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

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

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

Sim*_*ges 5

其实,我们找错地方了。经过所有这些调查,我终于找到了诀窍。

在结果屏幕上(我们将查询保存到搜索 SearchRecentSuggestions 的位置)我们调用此方法

SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this,
                    SearchSuggestionProvider.AUTHORITY, SearchSuggestionProvider.MODE);
suggestions.saveRecentQuery(query, null);
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Roc*_*dom 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) {
Run Code Online (Sandbox Code Playgroud)

您可能可以覆盖它并实施限制 - 但正如您所看到的,上面的注释明确指出“不要覆盖”。在现有方法中没有强制执行限制。

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

示例: 将 SearchRecentSuggestionsProvider 与一些预定义术语一起使用?

基于此,我认为您可以尝试一下 - 覆盖查询方法并添加您自己的支持限制结果的实现。解析SearchManager.SUGGEST_PARAMETER_LIMIT您在查询方法中使用的 并使用它来限制返回的结果。