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); } } 
  • Seleccione las primeras filas en contentProvider
  • Android - Uso del patrón Dao con contentProvider
  • ¿Cuándo debo llamar a close () en SQLiteOpenHelper utilizado por ContentProvider
  • ¿Error de eliminación o éxito de ContentProviderResult ?
  • Propósito del parámetro args de getLoaderManager (). InitLoader (..., ..., ...)?
  • Obtener número de teléfono para varios destinatarios en android
  • Cómo agregar una cláusula de límite utilizando el proveedor de contenido
  • ¿Necesito un proveedor de contenido con un cargador de cursor?
  • Página web del navegador web de Android
  • Android: obtener el nombre del archivo adjunto de correo electrónico en mi aplicación
  • Negación de permisos de Android en Widget RemoteViewsFactory para contenido
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.