Как сохранить историю поиска в приложение?

Рейтинг: 0Ответов: 1Опубликовано: 09.04.2023

В своем приложение я использую библиотеку MaterialSearchBar Проблема в том что пока я нахожусь в приложение, история поиска отображается, но как только я выхожу она пропадает. Пробовал сохранять всё с помощью SharedPreferences, но у меня нечего не отображается. Так же есть три лога: save, saves и load, последний не отображается вообще.

введите сюда описание изображения

public class MainActivity extends AppCompatActivity implements MaterialSearchBar.OnSearchActionListener {

    private MaterialSearchBar searchBar;
    private List<String> lastSearches;
    ArrayList<SaveSearchModel> arrayList;
    String SAVE = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        searchBar = findViewById(R.id.search);
        searchBar.setHint("Your product");
        searchBar.setSpeechMode(true);
        searchBar.setOnSearchActionListener(this);
        loadSearchSuggestionFromDisk();

        try {
            saveSearchSuggestionToDisk(searchBar.getLastSuggestions().toString());
        } catch(Exception e) {
            e.printStackTrace();
        }

    }

    // Saved search history
    private void saveSearchSuggestionToDisk(String search) {
        SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("DATA", MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();

        Gson gson = new Gson();
        arrayList.add(new SaveSearchModel(search));
        String json = gson.toJson(arrayList);
        editor.putString("search_data", json);
        editor.apply();
        loadSearchSuggestionFromDisk();
        Log.e("save", search);
    }

    // Load search history
    private void loadSearchSuggestionFromDisk() {
        SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("DATA", MODE_PRIVATE);
        Gson gson = new Gson();
        String json = sharedPreferences.getString("search_data", null);
        Type type = new TypeToken<ArrayList<SaveSearchModel>>() {}.getType();
        arrayList = gson.fromJson(json, type);

        if (arrayList != null) {
            for(int i = 0; i < arrayList.size(); i++) {
                searchBar.getLastSuggestions();
                Log.e("load", String.valueOf(arrayList));

            }
        }
    }

    @Override
    public void onSearchStateChanged(boolean b) {
        String state = b ? "enable" : "disable";
        Toast.makeText(this, "Search " + state, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onSearchConfirmed(CharSequence charSequence) {
        SAVE = charSequence.toString();
        Log.e("saves", searchBar.getLastSuggestions().toString());

        Toast.makeText(this, "Searching " + charSequence.toString() + " ...", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onButtonClicked(int i) {
        switch (i) {
            case MaterialSearchBar.BUTTON_NAVIGATION:
                Toast.makeText(MainActivity.this, "Button Nav ", Toast.LENGTH_SHORT).show();
                break;
        }
    }
}

При ответе указанном ниже в тег load я получаю null а в тег save 2023-04-09 18:02:05.631 12134-12134/com.buratinoapps.materialsearchbarhistory E/saves: com.buratinoapps.materialsearchbarhistory.MainActivity$2@b234126

В коде изменил только метод loadSearchSuggestionFromDisk() проверка на null.

       // Load search history
        private List<String> loadSearchSuggestionFromDisk() {
            SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("DATA", MODE_PRIVATE);
            Gson gson = new Gson();
            String json = sharedPreferences.getString("search_data", null);
            Type type = new TypeToken<List<String>>() {}.getType();
            List<String> lastSearches = gson.fromJson(json, type);
            Log.e("load", String.valueOf(lastSearches));
            if (lastSearches != null) {
                return lastSearches;
            } else {
                return lastSearches = new List<String>() {
                    @Override
                    public int size() {
                        return 0;
                    }
    
                    @Override
                    public boolean isEmpty() {
                        return false;
                    }
    
                    @Override
                    public boolean contains(@Nullable Object o) {
                        return false;
                    }
    
                    @NonNull
                    @Override
                    public Iterator<String> iterator() {
                        return null;
                    }
    
                    @NonNull
                    @Override
                    public Object[] toArray() {
                        return new Object[0];
                    }
    
                    @NonNull
                    @Override
                    public <T> T[] toArray(@NonNull T[] a) {
                        return null;
                    }
    
                    @Override
                    public boolean add(String s) {
                        return false;
                    }
    
                    @Override
                    public boolean remove(@Nullable Object o) {
                        return false;
                    }
    
                    @Override
                    public boolean containsAll(@NonNull Collection<?> c) {
                        return false;
                    }
    
                    @Override
                    public boolean addAll(@NonNull Collection<? extends String> c) {
                        return false;
                    }
    
                    @Override
                    public boolean addAll(int index, @NonNull Collection<? extends String> c) {
                        return false;
                    }
    
                    @Override
                    public boolean removeAll(@NonNull Collection<?> c) {
                        return false;
                    }
    
                    @Override
                    public boolean retainAll(@NonNull Collection<?> c) {
                        return false;
                    }
    
                    @Override
                    public void clear() {
    
                    }
    
                    @Override
                    public String get(int index) {
                        return null;
                    }
    
                    @Override
                    public String set(int index, String element) {
                        return null;
                    }
    
                    @Override
                    public void add(int index, String element) {
    
                    }
    
                    @Override
                    public String remove(int index) {
                        return null;
                    }
    
                    @Override
                    public int indexOf(@Nullable Object o) {
                        return 0;
                    }
    
                    @Override
                    public int lastIndexOf(@Nullable Object o) {
                        return 0;
                    }
    
                    @NonNull
                    @Override
                    public ListIterator<String> listIterator() {
                        return null;
                    }
    
                    @NonNull
                    @Override
                    public ListIterator<String> listIterator(int index) {
                        return null;
                    }
    
                    @NonNull
                    @Override
                    public List<String> subList(int fromIndex, int toIndex) {
                        return null;
                    }
                };
           

 }
    }

При отладке log save я его не получаю в логах за то показывает лог saves E/saves: com.buratinoapps.materialsearchbarhistory.MainActivity$2@606f068

введите сюда описание изображения

А при загрузке в логе load я получаю null, а так же если в моем коде я получал историю поиска до того как закрою приложение то теперь её вообще не выводит.

Ответы

▲ 1Принят

Сохранять нужно в onDestroy(), а не в onCreate(), где поиск ещё даже не виден и тем более его трогали. И что-то непонятное вы делаете со списком при сохранении/восстановлении. Может я чего-то не так понял, но думаю это должно выглядеть так:

public class MainActivity extends AppCompatActivity implements MaterialSearchBar.OnSearchActionListener {

    private MaterialSearchBar searchBar;
    String SAVE = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        searchBar = findViewById(R.id.search);
        searchBar.setHint("Your product");
        searchBar.setSpeechMode(true);
        searchBar.setOnSearchActionListener(this);
        searchBar.setLastSuggestions(loadSearchSuggestionFromDisk());
    }

    @Override
    protected void onDestroy() {
        //save last queries to disk
        saveSearchSuggestionToDisk(searchBar.getLastSuggestions());
        super.onDestroy();
    }

    // Saved search history
    private void saveSearchSuggestionToDisk(List<String> lastSearches) {
        SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("DATA", MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();

        Gson gson = new Gson();
        String json = gson.toJson(lastSearches);
        editor.putString("search_data", json);
        editor.apply();
        Log.e("save", lastSearches.toString());
    }

    // Load search history
    private List<String> loadSearchSuggestionFromDisk() {
        List<String> result = new ArrayList<>();
        SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("DATA", MODE_PRIVATE);
        Gson gson = new Gson();
        String json = sharedPreferences.getString("search_data", null);
        if (json != null) {
            Type type = new TypeToken<List<String>>() {}.getType();
            List<String> lastSearches = gson.fromJson(json, type);
            result.addAll(lastSearches);
        }
        Log.e("load", String.valueOf(result));
        return result;
    }

    @Override
    public void onSearchStateChanged(boolean b) {
        String state = b ? "enable" : "disable";
        Toast.makeText(this, "Search " + state, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onSearchConfirmed(CharSequence charSequence) {
        SAVE = charSequence.toString();
        Log.e("saves", searchBar.getLastSuggestions().toString());

        Toast.makeText(this, "Searching " + charSequence.toString() + " ...", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onButtonClicked(int i) {
        switch (i) {
            case MaterialSearchBar.BUTTON_NAVIGATION:
                Toast.makeText(MainActivity.this, "Button Nav ", Toast.LENGTH_SHORT).show();
                break;
        }
    }
}