【问题标题】:Multiple SearchRecentSuggestionsProvider classes in Android app possible?Android 应用程序中可能有多个 SearchRecentSuggestionsProvider 类?
【发布时间】:2011-06-17 09:32:10
【问题描述】:

我在我的应用程序中使用SearchManager 实现了两个不同的搜索活动。一种是整个应用程序的默认可搜索项,另一种仅用于一项活动。这两个搜索执行不同数据的查找,并且在两个不同搜索之间共享搜索历史是没有意义的。这两个不同的可搜索项在应用程序中功能正常,我的问题是最近的搜索历史记录。

问题是应用程序中定义了两个不同的SearchRecentSuggestionsProvider 类,但在一个中进行的任何搜索都会显示在两个搜索的最近搜索建议历史记录中。我已通读 Dev Guide 中的 SearchManager 主题,但没有看到有关多个建议提供者的任何信息。

这是AndroidManifest.xml中的两个提供者,在节点中:

<provider android:name=".SearchOneRecentSuggestionsProvider"
 android:authorities="com.company.SearchOneRecentSuggestionsProvider"></provider>
<provider android:name=".SearchTwoRecentSuggestionsProvider"
    android:authorities="com.company.SearchTwoRecentSuggestionsProvider"></provider>

这是 SearchOneRecentSuggestionsProvider.java 中定义的类:

package com.company;

import android.content.SearchRecentSuggestionsProvider;

public class SearchOneRecentSuggestionsProvider extends SearchRecentSuggestionsProvider {
     public final static String AUTHORITY = "com.company.SearchOneRecentSuggestionsProvider";
     public final static int MODE = DATABASE_MODE_QUERIES;

     public SearchOneRecentSuggestionsProvider() {
      setupSuggestions(AUTHORITY, MODE);
     }
    }

(SearchTwoRecentSuggestionsProvider 类看起来完全一样,只是将 One 替换为 Two,并且在它自己的 SearchTwoRecentSuggestionsProvider.java 文件中。)

以下是搜索建议数据库中的内容(位于 /data/data/com.company/databases/suggestions.db):

# sqlite3 suggestions.db
SQLite version 3.5.9
Enter ".help" for instructions
sqlite> .tables
android_metadata  suggestions
sqlite> .schema suggestions
CREATE TABLE suggestions (_id INTEGER PRIMARY KEY,display1 TEXT UNIQUE ON CONFLICT REPLACE,query TEXT,date LONG);
sqlite> select * from suggestions;
1|searchone|searchone|1296177852444
2|searchtwo|searchtwo|1296177878744

SearchRecentSuggestionsProvider 没有列,所以也许没有办法将两个搜索的历史分开?

所有这一切的最终结果是,当您在两种不同搜索中的任何一种中进行搜索时,您会在最近的搜索历史建议中看到 searchone 和 searchtwo。如果可能的话,我希望每个人都有自己的历史。希望我没有错过一些愚蠢的事情!感谢您抽出宝贵时间阅读本文。

【问题讨论】:

    标签: android search android-searchmanager


    【解决方案1】:

    我查看了SearchRecentSuggestionsProviderSearchRecentSuggestions 源代码,很明显这些类被设计为在所有应用程序中使用一个公共数据库,而不是关于您是否使用多个提供程序(因此在同一个应用程序中使用多个 SearchRecentSuggestionsProvider应用程序没用)。我找不到使用两个不同数据库的方法。

    但我想到了一个技巧:在使用 saveRecentQuery() 保存每个查询时,在每个查询的开头添加一个字符(例如 '1' 表示 activity1 最近搜索,而 '2' 表示 activity2 最近搜索)。如果您在活动 1 中,您将执行 saveRecentQuery('1' + query, ...)。

    然后重写 SearchRecentSuggestionsProvider.query(),在这里你可以根据第一个字符的值,'1' 或 '2' 过滤你想要显示的行(当然你也必须从字符串中删除它) .如果您在 activity1 上,您只想保留以 '1', ... 开头的值。这样您就可以处理多个建议列表。

    但这是一个技巧,我不能 100% 确定它会像这样工作......

    【讨论】:

    • 感谢您的回答,我还查看了源代码,发现数据库名称是硬编码的。我只是希望我错过了一些简单的东西。我将与我的同事讨论您的解决方法建议,看看这是否对我们有用。
    【解决方案2】:

    目前看来不可能。对于那些在 SO 中搜索相同问题的人,请参阅 https://code.google.com/p/android/issues/detail?id=13501 以了解来自 Google 的未来更新。

    【讨论】:

      【解决方案3】:

      我对类进行了一些小修改,使之成为可能 - 请参阅 https://gist.github.com/pokebyte/a08a67282a4f19ebbf52

      具体而言,此更改添加了一个新的索引列 (authority),将搜索限制为特定权限。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多