2012-01-29 15 views
6

He leído toda la documentación en línea sobre cómo crear interfaces de búsqueda y cómo agregar sugerencias personalizadas ... pero aún no tengo claro cómo funciona esto. La documentación dice que debo "Crear una tabla (como en una base de datos SQLite) para sus sugerencias y formatear la tabla con las columnas requeridas". Supongo que el sistema eventualmente llenará esta tabla con las sugerencias apropiadas por sí misma ... pero qué proceso/clase es responsable de esto, y cuándo ocurrirán las inserciones reales (antes de que el usuario haga una consulta, después de un la consulta ha sido hecha por el usuario, etc.)?SearchManager - agregar sugerencias personalizadas

Y mientras hago una pregunta aquí, si alguien puede aclarar la diferencia entre un AutoCompleteTextView y un SearchView con sugerencias personalizadas ... eso sería increíble. AutoCompleteTextView parece sospechosamente fácil de implementar en comparación con SearchView (que requiere que se realicen cambios en la clase de ayuda ContentProvider, SQLiteDatabase, etc.).

Respuesta

5

Tienes que crear un proveedor de contenido que entregue tus sugerencias personalizadas en base a una consulta hasta ahora ingresada en la vista de búsqueda. En su archivo searchable.xml, configura la duración mínima de la expresión de búsqueda, que debe alcanzarse antes de solicitar sugerencias. Este proveedor de contenido se llama proveedor de sugerencias (aún extiende ContentProvider). La autoridad del proveedor de contenido también está configurada en searchable.xml.

No hay ninguna limitación sobre cómo el proveedor de sugerencias calcula sus sugerencias. Puede buscar en la consulta web una base de datos o leer un archivo. Pero la respuesta a la consulta está en el formato de una tabla. Si las sugerencias se consultan directamente desde una base de datos, puede usar el cursor que responde la consulta de la base de datos para entregar el resultado en el método query() del proveedor de contenido. Si el resultado se calcula a partir de una o más fuentes, puede crear una tabla sobre la marcha utilizando un MatrixCursor.

Las filas de la respuesta del proveedor de sugerencias son utilizadas por el mecanismo de búsqueda para mostrar la sugerencia, se almacenan en una tabla. El formato de las filas es la siguiente:

private static final String[] COLUMNS = { 
    "_id", 
    SearchManager.SUGGEST_COLUMN_ICON_1,  // ID of a drawable (icon) as String 
    SearchManager.SUGGEST_COLUMN_TEXT_1,  // main text for suggestion display 
    SearchManager.SUGGEST_COLUMN_TEXT_2,  // secondary text for suggestion display 
    SearchManager.SUGGEST_COLUMN_INTENT_DATA, // this could be an URI to access the suggestion as used in an intent with a VIEW action 
    SearchManager.SUGGEST_COLUMN_INTENT_ACTION, // this could be Intent.ACTION_VIEW 
    SearchManager.SUGGEST_COLUMN_SHORTCUT_ID // e.g. SearchManager.SUGGEST_NEVER_MAKE_SHORTCUT 
}; 

buscando es descrito aquí con más detalle: http://developer.android.com/guide/topics/search/index.html

+0

bien ... creo que estoy empezando a entender. ¿Pero cuándo/dónde se insertan las sugerencias en una tabla, y qué formato tienen las sugerencias? Eso es lo que estoy confundido. Asumiría que este tipo de característica "autocompletar"/sugerencia se implementaría usando un Trie o algo ... –

+0

es decir, ¿a qué se parece la tabla de sugerencias? ¿o la tabla resultante no es necesariamente legible por humanos? ¿Cuándo se crea esta tabla (¿necesitas crearla usando 'execSQL')? –

+0

me gustaría obtener una característica simple de búsqueda "autocompletar/sugerir-completar" sobre una cierta columna en mi base de datos ... pero si eso significa cambiar toda mi base de datos y meterme con un montón de archivos, siempre podría regresar para ello en una fecha posterior (¡aunque sigo creyendo que esto no debería tardar tanto en implementarse! ¡Todo lo que quiero es que el sistema se complete automáticamente en una sola columna de cadenas en mi base de datos!). –

Cuestiones relacionadas