【问题标题】:Android SearchRecentSuggestionsProvider query limitAndroid SearchRecentSuggestionsProvider 查询限制
【发布时间】:2015-09-10 07:15:51
【问题描述】:

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

我的内容提供者正在扩展 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: 在 sortOrder 查询参数中添加限制

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

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

【问题讨论】:

  • SUGGEST_PARAMETER_LIMIT 查询参数添加到建议查询以限制返回的建议数量。 此限制仅供参考,建议提供者可以选择忽略它
  • 有一个更好的解决方案,完全不同的方式,我在下面添加了答案

标签: android android-contentprovider


【解决方案1】:

下面是框架中基类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) {

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

但是,我在 stack-overflow 和其他网站上的其他一些答案中看到人们确实会覆盖它。

示例: Use SearchRecentSuggestionsProvider with some predefined terms?

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

【讨论】:

  • “在实际查询数据库或任何数据源时使用此限制”这个问题与 SearchRecentSuggestionsProvider 相关。请更具体地说明如何在这种情况下覆盖 query
  • 对不起,我最初误解了这个问题。现在添加更多具体细节。
  • 完全不同的方式有更好的解决方案,我在下面添加了答案
【解决方案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);
    }
}

【讨论】:

  • 如果我理解正确,那将限制整个表的大小,但我要问的是如何限制查询行数?或者您的解决方案不会影响表格大小?
  • 是的,它会影响表格大小,但仍会保存最近的前 5 个。通过将表大小减少到 5 会影响查询行。但是,如果您想要显示更多历史查询之类的选项,这将无济于事。
猜你喜欢
  • 2022-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多