Límite de búsqueda Android SearchRecentSuggestionsProvider
Estoy trabajando con el marco de la sugerencia de la búsqueda y aquí está el caso. Obtengo alguna cadena de consulta y hago la consulta de resolver contenido, pero el problema es que no puedo limitar los resultados. He encontrado varias soluciones, pero no funcionan para mí.
Mi proveedor de contenido está extendiendo SearchRecentSuggestionsProvider y declarado en el manifiesto, aquí consulta uri Uri URI = Uri.parse("content://" + AUTHORITY + "/search_suggest_query");
- Consulta, copia de seguridad, eliminar, insertar contactos en Android
- ¿Qué pasa si devuelve false en OnCreate de ContentProvider?
- Proveedor de contenido de Android proporciona contenido de URL desconocido: // com
- Android Sincronización automática con datos personalizados
- Especificación de límite / desplazamiento para consultas de ContentProvider
Sol 1: agregando parámetro de consulta a uri
SearchSuggestionProvider.URI.buildUpon().appendQueryParameter(SearchManager.SUGGEST_PARAMETER_LIMIT, String.valueOf(5)).build()
Sol 2: agregando límite en el parámetro de consulta sortOrder
getContentResolver().query(URI, null, "?", new String[]{searchQuery}, "_id asc limit 5");
En ambos casos, la consulta devuelve todas las filas de las sugerencias de búsqueda. ¿Alguien sabe cómo limitar tal consulta?
- ContentProvider sin SQL
- Patrón de diseño de Google IO Rest, Finalizado ContentProvider y pegado ahora
- Acceso al proveedor de contenido UserDictionary en la API android nivel 23
- Cómo obtener mi aplicación para mostrarla en la página de Google Now "Phone / Tablet Search"
- No se pudo encontrar información del proveedor de 'ContentProvider'
- Uso de ContentResolver en lugar de ContentProviderClient en SyncAdapter
- ¿Debo usar un proveedor de contenido?
- ¿Cuál es el uso de proveedores de contenido privados?
A continuación se muestra el método de consulta en la clase base SearchRecentSuggestionsProvider en el marco
/** * This method is provided for use by the ContentResolver. Do not override, or directly * call from your own code. */ // TODO: Confirm no injection attacks here, or rewrite. @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
Potencialmente se puede anular e implementar la limitación – pero como se puede ver el comentario anterior, los estados claros "no sobrepasan". En el método existente no se impone ninguna limitación.
Sin embargo, veo en algunas de las otras respuestas sobre la pila de desbordamiento y otros sitios que la gente lo reemplaza.
Ejemplo: Use SearchRecentSuggestionsProvider con algunos términos predefinidos?
Sobre la base de esto creo que puede probarlo – sobreescribir el método de consulta y añadir su propia aplicación que apoya la limitación de los resultados. Analizar el SearchManager.SUGGEST_PARAMETER_LIMIT
que ha utilizado en el método de consulta y utilizarlo para limitar los resultados devueltos.
En realidad, estábamos buscando en el lugar equivocado. Después de todas estas investigaciones, finalmente encontré el truco.
En la pantalla de resultados (donde guardamos la consulta en la búsqueda SearchRecentSuggestions) llamamos a este método
SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this, SearchSuggestionProvider.AUTHORITY, SearchSuggestionProvider.MODE); suggestions.saveRecentQuery(query, null);
SearchRecentSuggestions fue el responsable de guardar esta consulta en el proveedor de contenido.
Esta clase tiene un método protegido llamado truncateHistory()
con esta documentación
Reduce la longitud de la tabla de historial, para evitar que crezca demasiado.
Así que la solución es simplemente, crear una clase personalizada, sobreescribir este método, y llamar a la super implementación con el límite requerido.
Aquí está el ejemplo
public class SearchRecentSuggestionsLimited extends SearchRecentSuggestions { private int limit; public SearchRecentSuggestionsLimited(Context context, String authority, int mode, int limit) { super(context, authority, mode); this.limit = limit; } @Override protected void truncateHistory(ContentResolver cr, int maxEntries) { super.truncateHistory(cr, limit); } }
- Desarrollo de Android: probablemente el archivo esté comprimido
- Xamarin Android: System.IO.Compression.ZipFile.ExtractToDirectory Error en el modo de liberación