Возможно ли использовать несколько классов SearchRecentSuggestionsProvider в приложении Android? - PullRequest
9 голосов
/ 28 января 2011

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

Ответы [ 3 ]

2 голосов
/ 01 февраля 2011

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

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

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

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

1 голос
/ 02 февраля 2011

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

0 голосов
/ 23 января 2015

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...