2011-01-28 65 views
9

我在我的應用程序中使用SearchManager執行了兩項不同的搜索活動。一個是整個應用的默認搜索,另一個僅用於一個活動。這兩個搜索會執行不同數據的查找,並且在兩個不同的搜索中共享搜索歷史記錄是沒有意義的。這兩種不同的搜索功能在應用程序內功能良好,我的問題是最近的搜索歷史。可以在Android應用程序中使用多個SearchRecentSuggestionsProvider類?

問題是應用程序中定義了兩個不同的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替換One並且在它自己的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。如果可能,我希望每個人都有自己的歷史。希望我不會錯過一些愚蠢的東西!感謝您抽時間閱讀。

回答

2

我看着SearchRecentSuggestionsProviderSearchRecentSuggestions的源代碼,並明確這些類被設計爲使用中的所有應用程序的公共數據庫中,如果您使用多個供應商或沒有(因此使用多個SearchRecentSuggestionsProvider在相同的應用程序也沒用不是關於)。我找不到使用兩個不同數據庫的方法。

但是我想到了一個技巧:在saveRecentQuery()保存時,在每個查詢的開頭添加一個字符(比如'1'用於activity1最近的搜索,'2'用於activity2最近的搜索)。如果你在activity1中,你將執行saveRecentQuery('1'+ query,...)。

然後覆蓋SearchRecentSuggestionsProvider.query(),這裏您可以根據第一個字符'1'或'2'的值來過濾要顯示的行(當然,您還必須從字符串中刪除它)。如果你在activity1上,你只想保留以'1'開始的值,...。這樣你可以處理多個建議列表。

然而,它的一招,我不是100%肯定它會工作像這樣...

+0

感謝您的回答,我也查看了源代碼,並看到db名稱是硬編碼的。我只是希望我錯過簡單的東西。我會與同事討論您的解決方法建議,看看這可能對我們有用。 – 2011-02-01 16:09:27

相關問題