单独类中的SharedPreference?

问题描述

我正在尝试创建一个类,该类包含用于将对象的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);
    }
}