问题描述
我正在尝试创建一个类,该类包含用于将对象的ArrayList保存和加载到SharedPreferences中的方法。但是,当我尝试回载数据时,我之前已经保存了。好像它没有保存。我正在使用Google的Gson库提供帮助。
Instance_Read_Write.java
public class Instance_Read_Write {
public void saveData(Context context,ArrayList<Example> Examples){
SharedPreferences sharedPreferences = context.getSharedPreferences("instanceKey",Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
Gson gson = new Gson();
String json = gson.toJson(Examples);
editor.putString("list",json);
editor.apply();
}
public void loadData(Context context,ArrayList<Example> Examples) {
SharedPreferences sharedPreferences = context.getSharedPreferences("instanceKey",Context.MODE_PRIVATE);
Gson gson = new Gson();
String json = sharedPreferences.getString("list",null);
Type type = new Typetoken<ArrayList<Example>>() {}.getType();
Examples = gson.fromJson(json,type);
if (Examples == null) {
Examples = new ArrayList<>();
}
}
}
这就是我引用它们的方式。
MainActivity.java
Instance_Read_Write instance_read_write = new Instance_Read_Write();
instance_read_write.loadData(context,Examples);
Examples.add(new Example("test"));
...
...
...
instance_read_write.saveData(context,Examples);
有没有办法使这项工作有效?也许是一种更好的方法?
解决方法
放置类型代替令牌,
Examples = gson.fromJson(json,Example.class);
告诉我是否可行
,这解决了您发布的代码中的一个错误,即方法Examples
中的loadData
参数的处理。
由于看来loadData
的意图是始终产生ArrayList,所以我建议返回该实例。另外,您必须先创建一个空的ArrayList并将其传递,然后对其进行操作。
因此,使用返回ArrayList的方法:
public ArrayList<Example> loadData(Context context) {
ArrayList<Example> result;
SharedPreferences sharedPreferences = context.getSharedPreferences("instanceKey",Context.MODE_PRIVATE);
Gson gson = new Gson();
String json = sharedPreferences.getString("list",null);
Type type = new TypeToken<ArrayList<Example>>() {}.getType();
result = gson.fromJson(json,type);
if (result == null) {
result = new ArrayList<>();
}
return result;
}
// ... and the calling code (in MainActivity) looks like:
Examples = instance_read_write.loadData(context);
不要引起按值传递与按引用传递的讨论-您似乎希望通过在方法的主体中分配Example
实际参数来进行更新-它将不会-您只能对会影响它的对象进行操作:https://stackoverflow.com/a/40523/2711811。
为完成本主题,下面是一个解决方案,它将继续您传递Examples
对象的意图:
// In calling method...
Examples = new ArrayList<Example>;
instance_read_write.loadData(context,Examples);
//...in class Instance_Read_Write...
public void loadData(Context context,ArrayList<Example> Examples) {
SharedPreferences sharedPreferences = context.getSharedPreferences("instanceKey",null);
Type type = new TypeToken<ArrayList<Example>>() {}.getType();
ArrayList<Example> t = gson.fromJson(json,type);
if (t != null) {
Examples.addAll(t);
}
}