我正在研究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;
}
答案 0 :(得分:1)
我曾经遇到过相同的null问题
这是我解决的方法
我有一个名为language
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
。会更好。