我用 SearchManager 实现了两个不同的搜索 Activity 在我的应用程序中。一个是整个应用程序的默认搜索,另一个仅用于一个 Activity 。这两个搜索执行不同数据的查找,并且在两个不同的搜索之间共享搜索历史没有意义。这两个不同的可搜索项在应用程序中运行良好,我的问题是最近的搜索历史记录。
问题是有两个不同的SearchRecentSuggestionsProvider在应用程序中定义的类,但在一个应用程序中进行的任何搜索都会显示在两个搜索的最近搜索建议历史记录中。我已通读开发指南中的 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。如果可能的话,我希望每个人都有自己的历史。希望我没有错过一些愚蠢的事情!感谢您花时间阅读本文。
最佳答案
我查看了 SearchRecentSuggestionsProvider和 SearchRecentSuggestions源代码,显然这些类被设计为在所有应用程序中使用公共(public)数据库,而不考虑您是否使用多个提供程序(因此在同一个应用程序中使用多个 SearchRecentSuggestionsProvider 是无用的)。我找不到使用两个不同数据库的方法。
但我想到了一个技巧:在使用 saveRecentQuery() 保存查询时,在每个查询的开头添加一个字符(例如“1”表示 activity1 最近的搜索,“2”表示 activity2 最近的搜索)。如果您在 activity1 中,您将执行 saveRecentQuery('1' + query, ...)。
然后覆盖SearchRecentSuggestionsProvider.query(),在这里你可以根据第一个字符的值过滤你想要显示的行,'1'或'2'(你也必须从字符串中删除它,当然) .如果您在 activity1 上,您只想保留以 '1', ... 开头的值。这样您就可以处理多个建议列表。
但这是一个技巧,我不能 100% 确定它会像这样工作......
关于android - Android 应用程序中的多个 SearchRecentSuggestionsProvider 类可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4831122/