Возможно несколько классов SearchRecentSuggestionsProvider в приложении для Android?

У меня есть две разные операции поиска, реализованные в SearchManager в моем приложении. Один из них по умолчанию доступен для поиска для всего приложения, а другой используется только для одного действия. Эти два поиска выполняют поиск различных данных, и нет смысла делиться историей поиска в двух разных поисках. Две различные поисковые функции работают нормально внутри приложения, моя проблема связана с последними историями поиска.

Проблема в том, что в приложении есть два разных класса SearchRecentSuggestionsProvider , но любой поиск, сделанный в одном, появляется в истории поиска последних поисковых запросов. Я прочитал тему SearchManager в Руководстве по Dev, но не вижу никакой информации о нескольких поставщиках предложений.

Вот два провайдера в 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 в последних предложениях истории поиска. Я бы хотел, чтобы у каждого была своя история, если это возможно. Надеюсь, я не просто пропустил что-то глупое! Спасибо, что нашли время, чтобы прочитать это.

Solutions Collecting From Web of "Возможно несколько классов SearchRecentSuggestionsProvider в приложении для Android?"

Я посмотрел исходный код SearchRecentSuggestionsProvider и SearchRecentSuggestions , и, очевидно, эти классы были предназначены для использования общей базы данных среди всех приложений, а не для использования нескольких поставщиков или нет (поэтому использование нескольких SearchRecentSuggestionsProvider в том же приложении бесполезно). Я не могу найти способ использовать две разные базы данных.

Но я подумал о трюке: добавьте символ (например, «1» для последних поисков активности1 и «2» для последних поисков активности2) в начале каждого запроса при сохранении с помощью saveRecentQuery (). Если вы работаете в Activity1, вы будете делать saveRecentQuery ('1' + query, …).

Затем переопределите SearchRecentSuggestionsProvider.query (), здесь вы можете отфильтровать строки, которые вы хотите показать, в зависимости от значения первого символа: «1» или «2» (вы также должны удалить его из строки, конечно). Если вы работаете с активностью 1, вы хотите сохранить только значения, начинающиеся с «1», …. Таким образом, вы можете обрабатывать несколько списков предложений.

Однако это трюк, и я не уверен на 100%, что он будет работать вот так …

Похоже, в это время это невозможно. Для тех, кто ищет SO для этой же проблемы, см. https://code.google.com/p/android/issues/detail?id=13501 для будущих обновлений от Google.

Я сделал небольшую модификацию класса, которая делает это возможным – см. https://gist.github.com/pokebyte/a08a67282a4f19ebbf52

В частности, это изменение добавляет новый индексированный столбец ( authority ), который ограничивает поиск определенным полномочным органом.