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");

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?

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); } } 
  • ClassCastException: android.app.Application
  • Objetivo de la cámara Android FileUriExposedException para SDK> = 24
  • ContentResolver.notifyChange no funciona
  • ¿Necesito un proveedor de contenido con un cargador de cursor?
  • ¿Cuáles son la semántica de withValueBackReference?
  • Declaración de proveedor de contenido
  • ¿Cómo transferir archivos entre aplicaciones de Android que se ejecutan en el mismo dispositivo?
  • Filtrar entradas en las funciones personalizadas de ContentProvider
  • Proveedor de contenido URI matcher
  • Proveedor de contenido android
  • Android: acceder a la base de datos SQLite a través del proveedor de contenido o implementar DAO?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.