¿Son posibles varias clases SearchRecentSuggestionsProvider en la aplicación de Android?

Tengo dos actividades de búsqueda diferentes implementadas con SearchManager en mi aplicación. Una es la búsqueda predeterminada para la aplicación completa y la otra se utiliza para una sola actividad. Estas dos búsquedas realizan búsquedas de datos diferentes y no tiene sentido compartir el historial de búsqueda entre las dos búsquedas diferentes. Los dos searchables diferentes están funcionando bien funcionalmente dentro de la aplicación, mi problema es con los historiales de búsqueda recientes.

El problema es que hay dos clases diferentes de SearchRecentSuggestionsProvider definidas dentro de la aplicación, pero cualquier búsqueda realizada en una aparece en el historial de sugerencias de búsquedas recientes de ambas búsquedas. He leído el tema de SearchManager en la Guía de desarrollo pero no veo ninguna información sobre proveedores de sugerencias múltiples.

Estos son los dos proveedores de AndroidManifest.xml, en el nodo:

<provider android:name=".SearchOneRecentSuggestionsProvider" android:authorities="com.company.SearchOneRecentSuggestionsProvider"></provider> <provider android:name=".SearchTwoRecentSuggestionsProvider" android:authorities="com.company.SearchTwoRecentSuggestionsProvider"></provider> 

Aquí está la clase definida en 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); } } 

(La clase SearchTwoRecentSuggestionsProvider se ve exactamente igual excepto para reemplazar uno con dos y está en su propio archivo SearchTwoRecentSuggestionsProvider.java.)

Esto es lo que está dentro de la base de datos de sugerencias de búsqueda (en /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 

No hay columna para el SearchRecentSuggestionsProvider, así que tal vez no hay manera de separar el historial de las dos búsquedas?

El resultado final de todo esto es que cuando haces una búsqueda en cualquiera de las dos búsquedas diferentes, ves tanto searchone como searchtwo en las sugerencias recientes del historial de búsqueda. Me gustaría que cada uno tuviera su propia historia si es posible. Espero que no me pierda algo tonto! Gracias por tomarse el tiempo para leer esto.

Miré el código fuente de SearchRecentSuggestionsProvider y SearchRecentSuggestions , y claramente estas clases fueron diseñadas para usar una base de datos común entre todas las aplicaciones, no con respecto a si usas múltiples proveedores o no (así que usar varios SearchRecentSuggestionsProvider en la misma aplicación es inútil). No puedo encontrar una forma de utilizar dos bases de datos diferentes.

Pero pensé en un truco: añadir un carácter (como '1' para las búsquedas recientes activity1 y '2' para las búsquedas recientes activity2) al principio de cada consulta al guardarlas con saveRecentQuery (). Si estás en activity1, harás saveRecentQuery ('1' + query, …).

A continuación, sustituir SearchRecentSuggestionsProvider.query (), aquí puede filtrar las filas que desea mostrar en función del valor del primer carácter, '1' o '2' (también debe quitarlo de la cadena, por supuesto). Si estás en activity1 quieres mantener sólo valores empezando por '1', …. De esta manera puede manejar varias listas de sugerencias.

Sin embargo, es un truco, y no estoy 100% seguro de que funcionará de esta manera …

Parece que no es posible en este momento. Para aquellos que busquen SO para este mismo problema, consulte https://code.google.com/p/android/issues/detail?id=13501 para futuras actualizaciones de Google.

He hecho una pequeña modificación a la clase que hace esto posible – ver https://gist.github.com/pokebyte/a08a67282a4f19ebbf52

Específicamente, el cambio agrega una nueva columna indexada ( authority ) que restringe las búsquedas a una autoridad específica.

  • ¿Cómo puedo filtrar el listview con baseadapter?
  • Cursor de vista de búsqueda de android no visible como el mismo color de la barra de herramientas
  • ¿Cómo implementar autocompletetextview con listview?
  • Cómo eliminar la flecha HomeAsUpButton de ActionBar Sherlock cuando se establece un ActionView para la búsqueda?
  • Buscar todas las apariciones de una cadena en todo el proyecto en Android Studio
  • Android SearchView.onQueryTextSubmit (consulta de cadena)
  • Cómo cambiar las sugerencias de búsqueda Color del texto
  • SearchWidget no llama a onSearchRequested ()
  • ¿Cómo cambiar el color del pulgar en el buscador?
  • Android: Proporcionar autosugestión automática en android coloca Api?
  • En Android cómo cambiar el color de una letra / carácter en particular que se está buscando dentro de la lista
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.