我在我的应用中使用SearchManager实施了两项不同的搜索活动。一个是整个应用程序的默认搜索,另一个仅用于一个活动。这两个搜索执行不同数据的查找,并且在两个不同的搜索中共享搜索历史没有意义。这两个不同的搜索在应用程序中功能正常,我的问题是最近的搜索历史。
问题在于,应用中定义了两个不同的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 with 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。如果可能的话,我希望每个人都有自己的历史。希望我不会错过任何愚蠢的事情!感谢您花时间阅读本文。
答案 0 :(得分:2)
我查看了SearchRecentSuggestionsProvider和SearchRecentSuggestions源代码,显然这些类被设计为在所有应用程序中使用公共数据库,而不是关于是否使用多个提供程序(因此使用多个SearchRecentSuggestionsProvider在同一个应用程序中是无用的)。我找不到使用两个不同数据库的方法。
但是我想到了一个技巧:在使用saveRecentQuery()保存它们时,在每个查询开头添加一个字符(对于activity1最近搜索为'1',对于activity2最近搜索为'2')。如果你在activity1中,你将执行saveRecentQuery('1'+查询,...)。
然后重写SearchRecentSuggestionsProvider.query(),在这里你可以根据第一个字符'1'或'2'的值来过滤你想要显示的行(你当然也必须从字符串中删除它) 。如果你在activity1上,你只想保留以'1'开头的值,....这样您就可以处理多个建议列表。
然而,这是一个技巧,我不是100%确定它会像这样工作......
答案 1 :(得分:1)
目前看起来不可能。对于那些搜索同一问题的人,请参阅https://code.google.com/p/android/issues/detail?id=13501以了解Google的未来更新。
答案 2 :(得分:0)
我对课程进行了一些小修改,使其成为可能 - 请参阅https://gist.github.com/pokebyte/a08a67282a4f19ebbf52
具体而言,此更改会添加一个新的索引列(authority
),将列搜索限制为特定的权限。