2011-01-28 16 views
9

Ho due diverse attività di ricerca implementate con SearchManager nella mia app. Uno è il ricercabile predefinito per l'intera app e l'altro è utilizzato per una sola attività. Queste due ricerche eseguono ricerche di dati diversi e non ha senso condividere la cronologia delle ricerche tra le due diverse ricerche. Le due diverse ricerche sono funzionanti bene all'interno dell'app, il mio problema è con le cronologie di ricerca recenti.Multiple SearchRecentSuggestionsLe classi di prestatore nell'app per Android sono possibili?

Il problema è che esistono due diverse classi SearchRecentSuggestionsProvider definite all'interno dell'app, ma qualsiasi ricerca effettuata in una viene visualizzata nella cronologia dei suggerimenti di ricerca di entrambe le ricerche. Ho letto l'argomento SearchManager nella Guida Dev, ma non vedo alcuna informazione su più provider di suggerimenti.

Qui ci sono i due fornitori nel AndroidManifest.xml, nel nodo:

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

Ecco la classe definita in 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 classe SearchTwoRecentSuggestionsProvider sembra esattamente lo stesso tranne che per sostituire One with Two e si trova nel proprio file SearchTwoRecentSuggestionsProvider.java.)

Ecco cosa è all'interno del database suggerimenti per la ricerca (a /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 

Non c'è colonna per il SearchRecentSuggestionsProvider, quindi forse non c'è modo di separare la storia per le due ricerche ?

Il risultato finale di tutto questo è che quando si effettua una ricerca in una delle due diverse ricerche, si vedono sia searchone che searchtwo nei suggerimenti della cronologia delle ricerche recenti. Mi piacerebbe che ognuno avesse la propria storia, se possibile. Spero di non aver perso qualcosa di sciocco! Grazie per aver dedicato del tempo a leggere questo.

risposta

2

ho guardato il codice SearchRecentSuggestionsProvider e SearchRecentSuggestions fonte, e chiaramente queste classi sono state progettate per utilizzare un database comune tra tutte le applicazioni, non per quanto riguarda se si utilizzano più fornitori o non (in modo da utilizzare SearchRecentSuggestionsProvider multiple nella stessa applicazione è inutile). Non riesco a trovare un modo per utilizzare due diversi database.

Ma ho pensato a un trucco: aggiungere un carattere (come '1' per attività1 ricerche recenti e '2' per attività2 ricerche recenti) all'inizio di ogni query quando li si salva con saveRecentQuery(). Se ti trovi in ​​activity1, eseguirai saveRecentQuery ('1' + query, ...).

Quindi eseguire l'override di SearchRecentSuggestionsProvider.query(), qui è possibile filtrare le righe che si desidera mostrare in base al valore del primo carattere, '1' o '2' (è necessario anche rimuoverlo dalla stringa, ovviamente). Se sei in attività1, vuoi mantenere solo i valori che iniziano con "1", .... In questo modo puoi gestire più elenchi di suggerimenti.

però è un trucco, e sono sicuro al 100% che funzionerà come questo ...

+0

Grazie per la risposta, ho anche esaminato il codice sorgente e ho visto che il nome db era hardcoded. Speravo solo che mi mancasse qualcosa di semplice. Discuterò la tua proposta di soluzione con i miei colleghi e vedrò se ciò funzionerà forse per noi. –

+0

Qual è il nome db con hardcoded? –

Problemi correlati