从共享首选项中检索数组列表

时间:2018-09-26 11:39:06

标签: android arraylist sharedpreferences

我正在研究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 :(得分:1)

我曾经遇到过相同的null问题
这是我解决的方法
我有一个名为language

的arrayList
language = new ArrayList<String>  

我必须添加用户在单击按钮时在edittext上编写的所有内容,不要重复任何冗余值

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

记住每次都删除,否则它将再次创建null

答案 1 :(得分:0)

您缺少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);
}

答案 2 :(得分:0)

正在尝试将ArrayList保存到share preference中。

我建议您可以使用 PaperDB

这非常快,并且可以像ArrayList一样直接保存您的preference

您还可以使用它直接存储基本数据类型和模型类。

注意:它还减少了代码行。

答案 3 :(得分:0)

Function Test($value) { Write-Host "Variable value $value" } Invoke-Command -ComputerName "YourComputer" -ScriptBlock ${Function:Test} -ArgumentList "YourParameterValue" -> setData()上添加一些断点,并调试代码是必需的。

顺便说一句,在API 9或更高版本的设备上运行的editor.putInt("CategoryId",categoryId);editor.apply()似乎没有什么区别。

答案 4 :(得分:0)

用以下两种方法替换两种方法:

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(内置)库,该库可以轻松完成您想要实现的目标。

答案 5 :(得分:0)

Empty DataFrame Columns: [] Index: []
该方法使用相同的键(“ CategoryId”,“ CategoryName”)将列表中的每个项目保存。 但是,您使用public void setData(final Category category)从SharedPreference获取值。
显然,您永远无法通过这种方式获得正确的答案...

@Murat的答案纠正了该方法,并且效果很好。
但是我认为这不是保存列表的好方法。如果您确实想使用SP保存列表,则建议您先使用"CategoryId" + index或其他任何方法将对象转换为Gson。会更好。