Получить Arraylist из общих настроек - PullRequest
0 голосов
/ 26 сентября 2018

Я работаю над shared Preferences.В основном я сохраняю ArrayList в shared preferences, которые работают нормально.Теперь я хочу получить ArrayList из Shared preferences, но я получаю ноль.ArrayList извлекает из настроек, а также показывает его размер.но данные не устанавливаются в строку.Как я получаю ArrayList из общих настроек.вот мой код

public void saveRootCategory(List<Category> categories){
    preferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, MODE_PRIVATE);
    editor = preferences.edit();
    editor.putInt("RootCategory",categories.size());
    for (int i=0;i<categories.size();i++){
        setData(categories.get(i));
    }
    editor.apply();
}
public void setData(final Category category){
    categoryId = category.getId();
    categoryName = category.getCategoryName();
    editor.putInt("CategoryId",categoryId);
    editor.putString("CategoryName",categoryName);
}
public  ArrayList<String> getRootCategoy() {
    preferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, MODE_PRIVATE);
    ArrayList<String> rootCategories = new ArrayList<>();
    rootCategories.clear();
    int size = preferences.getInt("RootCategory", 0);
    for(int i=0;i<size;i++) {
        int Id = preferences.getInt("CategoryId" + i,0);
        String name = preferences.getString("CategoryName" + i ,"");
        rootCategories.add(String.valueOf(Id));
        rootCategories.add(name);
    }
    return rootCategories;
}

Ответы [ 6 ]

0 голосов
/ 26 сентября 2018

public void setData(final Category category)
Метод использует один и тот же ключ («CategoryId», «CategoryName») для сохранения каждого элемента в списке.Однако вы используете "CategoryId" + index, чтобы получить значение из SharedPreference.
Очевидно, что вы никогда не сможете получить правильный ответ таким образом ...

@ ответ Мурата исправит метод, и он может хорошо работать.
Но я не думаю, что это хороший способ сохранить список.Если вы хотите использовать SP для сохранения списков, я предлагаю Gson или любой другой способ сначала перевести ваш объект в String.Это будет работать лучше.

0 голосов
/ 26 сентября 2018

Раньше у меня была та же самая нулевая проблема
Вот как я решил ее
У меня есть arrayList с именем language

language = new ArrayList<String>  

Мне пришлось добавить все, что пользователь пишет в тексте редактированияпри нажатии кнопки, не повторяя никакого избыточного значения

    if(!language.contains(value)) {
         language.add(value);
}  

Чтобы сохранить этот массив, я создал hashSet

 Set<String> set = new HashSet<String>();  

и сохранил все из них onPause

set.addAll(language);
.putStringSet("yourKey", set);
.commit();  

и извлеките его обратно в language список массивов onCreate

prefs=this.getSharedPreferences("yourPrefsKey",Context.MODE_PRIVATE);
        edit=prefs.edit();
set = prefs.getStringSet("yourKey", null);
            language = new ArrayList<String>(set);
            edit.remove("yourKey").commit();  

не забудьте удалить каждый раз, или он снова создаст ноль

0 голосов
/ 26 сентября 2018

Замените оба метода на следующие:

public void saveRootCategory(List<Category> categories){
    preferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, MODE_PRIVATE);
    editor = preferences.edit();
    editor.putString("RootCategory",new Gson().toJson(categories));
    editor.apply();
}

public  ArrayList<Category> getRootCategoy() {
    preferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, MODE_PRIVATE);
    String data = preferences.getString("RootCategory","");
    return new Gson().fromJson(data, new TypeToken<List<Category>>(){}.getType());
}

Не требуется сторонняя библиотека, используйте библиотеку Gson (встроенную), которая может легко сделать то, что вы хотите достичь.

0 голосов
/ 26 сентября 2018

Добавьте несколько точек останова на setData() -> editor.putInt("CategoryId",categoryId); и отладьте ваш код.

Кстати, кажется, что нет никакой разницы, что вы называете editor.apply() или editor.commit(), работающий на API 9или выше устройства.

0 голосов
/ 26 сентября 2018

Поскольку вы пытаетесь сохранить ArrayList в share preference.

Я предлагаю вам использовать PaperDB Библиотека .

Это очень быстро и напрямую сохраняет ваш ArrayList так же, как preference.

Вы также можете использовать его для непосредственного хранения типов данных Primitive и класса модели.

Примечание: Это такжеуменьшает строки кода.

0 голосов
/ 26 сентября 2018

Вам не хватает индекса в setData.Измените его на

public void setData(final Category category, int index){
    categoryId = category.getId();
    categoryName = category.getCategoryName();
    editor.putInt("CategoryId" + index, categoryId);
    editor.putString("CategoryName" + index, categoryName);
}
...