Android SearchSuggestSelection habilita la consulta comienza con en lugar de contiene la búsqueda
-
11-12-2019 - |
Pregunta
estoy usando el android BuscarSugerenciasRecientesProveedor y Configuración con capacidad de búsqueda para mostrar búsquedas anteriores en la aplicación y le gustaría limitar las respuestas sugeridas para devolver solo entradas que comiencen con ?(lo que el usuario está escribiendo)
actualmente "p" devuelve teléfono, ipod, foto, feliz, y lo que busco es solo teléfono y foto
Algo equivalente a SQL como % pero parece que no puedo hacer que funcione.
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:hint="@string/product_search_hint"
android:imeOptions="actionSearch"
android:label="@string/app_label"
android:searchSuggestAuthority="com.myapp.ProductSearchSuggestionProvider"
android:searchSuggestSelection="word MATCH ?" >
</searchable>
Intentó:
android:searchSuggestSelection="WORD LIKE '%'?"
Solución
Si estuviera implementando un proveedor de sugerencias totalmente personalizado, aplicar personalizaciones en este nivel funcionaría como se esperaba.Sin embargo, en secreto, SearchRecentSuggestionsProvider consulta su tabla local con los siguientes argumentos codificados (echar un vistazo):
- selección = "mostrar1 ¿ME GUSTA?"
- selecciónArgs = ["%{query}%"]
donde {consulta} es la consulta de búsqueda (está intercalada entre signos de dos por ciento para que cualquier carácter que coincida en cualquier parte de la cadena cuente).Ignora el valor pasado para la cadena de selección (que es lo que está configurando con el searchSuggestSelection
parámetro) y la matriz args (más allá de verificar si está vacía), por lo que realmente no hay mucho que puedas hacer desde XML.
Debido a que la implementación ignora los parámetros entrantes, no existe una solución o anulación fácil.Para ahorrarse la codificación duplicada, yo haría lo siguiente:
- Copie la implementación completa de
SearchRecentSuggestionsProvider
desde el enlace de arriba.Nada de lo que haga la clase debe ser privado en el marco, por lo que se debe compilar una copia directa. - Modifique la declaración de construcción de la matriz args, dentro del
query()
método, serString like = selectionArgs[0] + "%"
en lugar deString like = "%" + selectionArgs[0] + "%"
(es decir.eliminar el primer porcentaje) - Subclase
ProductSearchSuggestionProvider
de su nueva implementación en su lugar.
Otros consejos
¿Has probado una concatenación de cadena?
word LIKE ? || '%'
||
es una concatenación de cadena en SQLite.