Android SearchSuggestSelection permite que a consulta comece com em vez de conter a pesquisa
-
11-12-2019 - |
Pergunta
Estou usando o Android SearchRecentSuggestionsProvider e Configuração pesquisável deseja exibir pesquisas anteriores em aplicativos e gostaria de limitar as respostas sugeridas para retornar apenas entradas que começam com ?(o que o usuário está digitando)
atualmente "p" retorna telefone, ipod, foto, feliz, e o que procuro é apenas telefone e foto
Algo equivalente ao SQL como%, mas não consigo fazer isso funcionar.
<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>
Testado:
android:searchSuggestSelection="WORD LIKE '%'?"
Solução
Se você estivesse implementando um provedor de sugestões totalmente personalizado, a aplicação de personalizações nesse nível funcionaria conforme o esperado.No entanto, nos bastidores, SearchRecentSuggestionsProvider consulta sua tabela local com os seguintes argumentos codificados (dar uma olhada):
- seleção = "display1 GOSTOU?"
- seleçãoArgs = ["%{query}%"]
onde {query} é a consulta de pesquisa (está imprensada entre sinais de dois por cento para que qualquer caractere corresponda em qualquer lugar da string).Ele ignora o valor passado para a string de seleção (que é o que você está definindo com o searchSuggestSelection
parâmetro) e o array args (além de verificar se está vazio), então não há muito que você possa fazer com XML.
Como a implementação ignora os parâmetros recebidos, não há correção ou substituição fácil.Para evitar codificação duplicada, eu:
- Copie toda a implementação de
SearchRecentSuggestionsProvider
do link acima.Nada que a classe faça deve ser privado da estrutura, portanto, uma cópia direta deve ser compilada. - Modifique a instrução de construção do array args, dentro do
query()
método, serString like = selectionArgs[0] + "%"
em vez deString like = "%" + selectionArgs[0] + "%"
(ou seja,remova a primeira porcentagem) - Subclasse
ProductSearchSuggestionProvider
da sua nova implementação.
Outras dicas
Você já tentou concatenação de strings?
word LIKE ? || '%'
||
é a concatenação de strings no SQLite.