Android SearchRecentSuggestionsProvider查询限制
我正在使用搜索建议框架,下面就是这个例子。我从内容解析器中获取一些查询字符串并进行查询,但问题是我无法限制结果。找到了几种解决方案,但它们对我不起作用 我的内容提供程序正在扩展SearchRecentSuggestionsProvider,并在清单中声明,此处为查询uriAndroid SearchRecentSuggestionsProvider查询限制,android,android-contentprovider,Android,Android Contentprovider,我正在使用搜索建议框架,下面就是这个例子。我从内容解析器中获取一些查询字符串并进行查询,但问题是我无法限制结果。找到了几种解决方案,但它们对我不起作用 我的内容提供程序正在扩展SearchRecentSuggestionsProvider,并在清单中声明,此处为查询uri Uri=Uri.parse(“content://“+AUTHORITY+”/search\u suggest\u query”) 解决方案1: 向uri添加查询参数 SearchSuggestionProvider.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,将影响查询行。但是,如果您想有一个类似“显示更多历史查询”的选项,这对您没有帮助。