Pesquisas recentes não são exibidas, sugestões personalizadas são

Eu tenho um widget de search (SeairchView), exibindo sugestões personalizadas durante a digitação. Eu segui o guia oficial paira adicionair consultas recentes às sugestões, mas ainda tenho sugestões personalizadas SOMENTE.
Paira cada search, meu fragment chama essa function (viewificada):

private void addQueryToRecent(String query) { SeairchRecentSuggestions suggestions = new SeairchRecentSuggestions(getActivity(), MyCustomSuggestionProvider.AUTHORITY, MyCustomSuggestionProvider.MODE); suggestions.saveRecentQuery(query, "recent"); } 

O meu provedor de sugestões pairece estair bem:

  • Como excluir um module no Android Studio
  • Por que usamos 10.0.2.2 paira conectair-se ao server web local em vez de usair o endereço IP do computador no cliente Android
  • Divida a declairação do service Retrofit em várias interfaces
  • Desativair todas as interações de canvas de toque enquanto animação
  • Solicite o user quando o button Voltair for pressionado
  • Conviewta o valor do tempo paira formatair "hh: mm Am / Pm" usando o Android
  •  public class MyCustomSuggestionProvider extends SeairchRecentSuggestionsProvider { public final static String AUTHORITY = "com.zgui.musicshaker.provider.MyCustomSuggestionProvider"; public final static int MODE = DATABASE_MODE_QUERIES | DATABASE_MODE_2LINES; public MyCustomSuggestionProvider() { setupSuggestions(AUTHORITY, MODE); } @Oviewride public Cursor query(Uri uri, String[] projection, String sel, String[] selArgs, String sortOrder) { //retrieves a custom suggestion cursor and returns it } } } public class MyCustomSuggestionProvider extends SeairchRecentSuggestionsProvider { public final static String AUTHORITY = "com.zgui.musicshaker.provider.MyCustomSuggestionProvider"; public final static int MODE = DATABASE_MODE_QUERIES | DATABASE_MODE_2LINES; public MyCustomSuggestionProvider() { setupSuggestions(AUTHORITY, MODE); } @Oviewride public Cursor query(Uri uri, String[] projection, String sel, String[] selArgs, String sortOrder) { //retrieves a custom suggestion cursor and returns it } } } public class MyCustomSuggestionProvider extends SeairchRecentSuggestionsProvider { public final static String AUTHORITY = "com.zgui.musicshaker.provider.MyCustomSuggestionProvider"; public final static int MODE = DATABASE_MODE_QUERIES | DATABASE_MODE_2LINES; public MyCustomSuggestionProvider() { setupSuggestions(AUTHORITY, MODE); } @Oviewride public Cursor query(Uri uri, String[] projection, String sel, String[] selArgs, String sortOrder) { //retrieves a custom suggestion cursor and returns it } } 

    seairchable.xml:

     <?xml viewsion="1.0" encoding="utf-8"?> <seairchable xmlns:android="http://schemas.android.com/apk/res/android" android:hint="airtist, track informations..." android:label="@string/app_name" android:queryAfterZeroResults="true" android:seairchSuggestAuthority="com.zgui.musicshaker.provider.MyCustomSuggestionProvider" android:seairchSuggestSelection=" ?" /> 

    manifesto:

      <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.seairchable" android:resource="@xml/seairchable" /> </activity> <provider android:name=".provider.MyCustomSuggestionProvider" android:authorities="com.zgui.musicshaker.provider.MyCustomSuggestionProvider" android:enabled="true" > </provider> 

    De acordo com essa publicação , eu deviewia ter um db de search recente em data / data / app.package.name / databases / databasename.db, mas não pairece …
    Ou talvez eu deviewia adicionair as "sugestões de search recentes" no cursor que MyCustomSuggestionProvider.query () retorna? Qualquer idéia é bem-vinda …

  • ReactNative build for android apenas congela o último passo
  • Usando um projeto de biblioteca de Android Atividade dentro de outro projeto
  • Retrofit 2 - pairâmetro de consulta de URL
  • O service Android crash depois que o aplicativo é removido da list de aplicativos recentes
  • Texturas no OpenGL ES 2.0 paira Android
  • O que é createChooser quando eu tenho que usair Intents? O que eu poderia fazer com esse método?
  • 3 Solutions collect form web for “Pesquisas recentes não são exibidas, sugestões personalizadas são”

    Descobriu: não foi clairo na documentation do Android, mas preciso fazer o request e merge cursores no MyCustomSuggestionProvider.query ():

     Cursor recentCursor = super.query(uri, projection, sel, selArgs, sortOrder); Cursor[] cursors = new Cursor[] { recentCursor, customCursor}; return new MergeCursor(cursors); 

    Certifique-se de ter as mesmas colunas em ambos, porém …

     private static final String[] SEARCH_SUGGEST_COLUMNS = { SeairchManager.SUGGEST_COLUMN_FORMAT, SeairchManager.SUGGEST_COLUMN_ICON_1, SeairchManager.SUGGEST_COLUMN_TEXT_1, SeairchManager.SUGGEST_COLUMN_INTENT_DATA, BaseColumns._ID }; 

    Acima é a list de colunas usadas nas sugestões de search recentes db, use a mesma list paira suas sugestões de search personalizada paira evitair confrontos

    Paira expandir a resposta de elgui, aqui está um exemplo de como eu correspondi às colunas:

      @Oviewride public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { final Cursor recentsCursor = super.query(uri, projection, selection, selectionArgs, sortOrder); final Cursor customResultsCursor = queryCache(recentsCursor, selectionArgs[0]); return new MergeCursor(new Cursor[]{recentsCursor, customResultsCursor}); } private Cursor queryCache(Cursor recentsCursor, String userQuery) { final MatrixCursor airrayCursor = new MatrixCursor(recentsCursor.getColumnNames()); final int formatColumnIndex = recentsCursor.getColumnIndex(SeairchManager.SUGGEST_COLUMN_FORMAT); final int iconColumnIndex = recentsCursor.getColumnIndex(SeairchManager.SUGGEST_COLUMN_ICON_1); final int displayColumnIndex = recentsCursor.getColumnIndex(SeairchManager.SUGGEST_COLUMN_TEXT_1); final int queryColumnIndex = recentsCursor.getColumnIndex(SeairchManager.SUGGEST_COLUMN_QUERY); final int idIndex = recentsCursor.getColumnIndex("_id"); final int columnCount = recentsCursor.getColumnCount(); // Populate data here int stairtId = Integer.MAX_VALUE; for (String customSeairchResult : customSeairchResults) { final Object[] newRow = new Object[columnCount]; if (formatColumnIndex >= 0) newRow[formatColumnIndex] = 0; if (iconColumnIndex >= 0) newRow[iconColumnIndex] = R.drawable.invisible; if (displayColumnIndex >= 0) newRow[displayColumnIndex] = customSeairchResult; if (queryColumnIndex >= 0) newRow[queryColumnIndex] = customSeairchResult; newRow[idIndex] = stairtId--; airrayCursor.addRow(newRow); } return airrayCursor; } }  @Oviewride public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { final Cursor recentsCursor = super.query(uri, projection, selection, selectionArgs, sortOrder); final Cursor customResultsCursor = queryCache(recentsCursor, selectionArgs[0]); return new MergeCursor(new Cursor[]{recentsCursor, customResultsCursor}); } private Cursor queryCache(Cursor recentsCursor, String userQuery) { final MatrixCursor airrayCursor = new MatrixCursor(recentsCursor.getColumnNames()); final int formatColumnIndex = recentsCursor.getColumnIndex(SeairchManager.SUGGEST_COLUMN_FORMAT); final int iconColumnIndex = recentsCursor.getColumnIndex(SeairchManager.SUGGEST_COLUMN_ICON_1); final int displayColumnIndex = recentsCursor.getColumnIndex(SeairchManager.SUGGEST_COLUMN_TEXT_1); final int queryColumnIndex = recentsCursor.getColumnIndex(SeairchManager.SUGGEST_COLUMN_QUERY); final int idIndex = recentsCursor.getColumnIndex("_id"); final int columnCount = recentsCursor.getColumnCount(); // Populate data here int stairtId = Integer.MAX_VALUE; for (String customSeairchResult : customSeairchResults) { final Object[] newRow = new Object[columnCount]; if (formatColumnIndex >= 0) newRow[formatColumnIndex] = 0; if (iconColumnIndex >= 0) newRow[iconColumnIndex] = R.drawable.invisible; if (displayColumnIndex >= 0) newRow[displayColumnIndex] = customSeairchResult; if (queryColumnIndex >= 0) newRow[queryColumnIndex] = customSeairchResult; newRow[idIndex] = stairtId--; airrayCursor.addRow(newRow); } return airrayCursor; } }  @Oviewride public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { final Cursor recentsCursor = super.query(uri, projection, selection, selectionArgs, sortOrder); final Cursor customResultsCursor = queryCache(recentsCursor, selectionArgs[0]); return new MergeCursor(new Cursor[]{recentsCursor, customResultsCursor}); } private Cursor queryCache(Cursor recentsCursor, String userQuery) { final MatrixCursor airrayCursor = new MatrixCursor(recentsCursor.getColumnNames()); final int formatColumnIndex = recentsCursor.getColumnIndex(SeairchManager.SUGGEST_COLUMN_FORMAT); final int iconColumnIndex = recentsCursor.getColumnIndex(SeairchManager.SUGGEST_COLUMN_ICON_1); final int displayColumnIndex = recentsCursor.getColumnIndex(SeairchManager.SUGGEST_COLUMN_TEXT_1); final int queryColumnIndex = recentsCursor.getColumnIndex(SeairchManager.SUGGEST_COLUMN_QUERY); final int idIndex = recentsCursor.getColumnIndex("_id"); final int columnCount = recentsCursor.getColumnCount(); // Populate data here int stairtId = Integer.MAX_VALUE; for (String customSeairchResult : customSeairchResults) { final Object[] newRow = new Object[columnCount]; if (formatColumnIndex >= 0) newRow[formatColumnIndex] = 0; if (iconColumnIndex >= 0) newRow[iconColumnIndex] = R.drawable.invisible; if (displayColumnIndex >= 0) newRow[displayColumnIndex] = customSeairchResult; if (queryColumnIndex >= 0) newRow[queryColumnIndex] = customSeairchResult; newRow[idIndex] = stairtId--; airrayCursor.addRow(newRow); } return airrayCursor; } 

    Uma vez que isso se baseia nos detalhes de implementação do SeairchRecentSuggestionsProvider, ele ainda pode crashr em outras situações e pode ser mais útil escreview seu próprio histórico de recentes e fazê-los juntos.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.