9

アプリのSearchManagerで2つの異なる検索アクティビティを実装しています。1つはアプリ全体のデフォルトの検索可能であり、もう1つは1つのアクティビティにのみ使用されます。これらの2つの検索は異なるデータのルックアップを実行し、2つの異なる検索間で検索履歴を共有することは意味がありません。2つの異なる検索可能ファイルはアプリ内で機能的に正常に機能しています。私の問題は、最近の検索履歴にあります。

問題は、アプリ内で2つの異なるSearchRecentSuggestionsProviderクラスが定義されているが、1つで行われた検索は、両方の検索の最近の検索候補履歴に表示されることです。開発ガイドのSearchManagerトピックを読みましたが、複数の提案プロバイダーに関する情報が表示されません。

ノード内のAndroidManifest.xmlの2つのプロバイダーは次のとおりです。

<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の列がないので、2つの検索の履歴を分離する方法がないのではないでしょうか。

このすべての最終結果は、2つの異なる検索のいずれかで検索を実行すると、最近の検索履歴の候補にsearchoneとsearchtwoの両方が表示されることです。できればそれぞれに独自の歴史を持ってもらいたいです。うまくいけば、私は愚かな何かを見逃しただけではありませんでした!これをお読みいただきありがとうございます。

4

3 に答える 3

2

SearchRecentSuggestionsProviderSearchRecentSuggestionsのソースコードを調べましたが、これらのクラスは、複数のプロバイダーを使用するかどうかに関係なく、すべてのアプリケーションで共通のデータベースを使用するように設計されていることは明らかです(したがって、同じアプリで複数のSearchRecentSuggestionsProviderを使用することは無意味です)。2つの異なるデータベースを使用する方法が見つかりません。

しかし、私はトリックについて考えました。saveRecentQuery()で保存するときに、各クエリの先頭に文字(activity1の最近の検索の場合は「1」、activity2の最近の検索の場合は「2」など)を追加します。activity1を使用している場合は、saveRecentQuery( '1' + query、...)を実行します。

次に、SearchRecentSuggestionsProvider.query()をオーバーライドします。ここで、最初の文字「1」または「2」の値に応じて、表示する行をフィルタリングできます(もちろん、文字列からも削除する必要があります)。activity1を使用している場合は、「1」で始まる値のみを保持する必要があります...。このようにして、複数の提案リストを処理できます。

しかし、それはトリックであり、私はそれがこのように機能するかどうか100%確信していません...

于 2011-02-01T02:28:42.917 に答える
1

現時点では不可能のようです。この同じ問題についてSOを検索している方は、Googleからの今後の更新について、 https://code.google.com/p/android/issues/detail?id=13501を参照してください。

于 2011-02-01T22:57:02.117 に答える
0

これを可能にするためにクラスに小さな変更を加えました-https://gist.github.com/pokebyte/a08a67282a4f19ebbf52を参照してください

authority具体的には、この変更により、検索を特定の機関に制限する新しいインデックス付き列()が追加されます。

于 2015-01-23T01:51:07.413 に答える