2011-01-28 11 views
9

Tengo dos actividades de búsqueda diferentes implementadas con SearchManager en mi aplicación. Uno es el que se puede buscar por defecto para toda la aplicación y el otro se usa para una sola actividad. Estas dos búsquedas realizan búsquedas de datos diferentes, y no tiene sentido compartir el historial de búsqueda en las dos búsquedas diferentes. Las dos búsquedas diferentes funcionan bien desde el punto de vista funcional en la aplicación, mi problema es con los historiales de búsqueda recientes.Múltiples clases SearchRecentSuggestionsProvider en la aplicación de Android posible?

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

Éstos son los dos proveedores en el 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 One with Two y está en su propio archivo SearchTwoRecentSuggestionsProvider.java).

Esto es lo que es 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 ninguna columna para el SearchRecentSuggestionsProvider, por lo que quizá no hay manera de separar la historia de las dos búsquedas ?

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

Respuesta

2

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

Pero pensé en un truco: agregar un personaje (como '1' para las búsquedas recientes de activity1 y '2' para búsquedas recientes de activity2) al comienzo de cada consulta al guardarlas con saveRecentQuery(). Si está en actividad1, hará saveRecentQuery ('1' + query, ...).

Luego reemplaza SearchRecentSuggestionsProvider.query(), aquí puedes filtrar las filas que deseas mostrar dependiendo del valor del primer caracter, '1' o '2' (también debes quitarlo de la cadena, por supuesto) Si está en la actividad1, desea mantener solo los valores que comienzan con '1', .... De esta forma puede manejar múltiples listas de sugerencias.

Sin embargo, es un truco, y no estoy 100% seguro de que funcionará como esto ...

+0

Gracias por su respuesta, también había examinado el código fuente y vi que el nombre db estaba codificado. Solo esperaba haberme perdido algo simple. Discutiré su sugerencia de solución alternativa con mis colegas y veremos si eso puede funcionar para nosotros. –

+0

¿Cuál es el nombre de db codificado? –

Cuestiones relacionadas