单独 class 中的 SharedPreference?
SharedPreference in a separate class?
我正在尝试创建一个 class,它将包含用于将对象的 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);
告诉我它是否有效
这解决了您发布的代码中的一个错误,即方法 loadData
方法中 Examples
参数的处理。
因为您 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);
不要引发 pass-by-value 与 pass-by-reference 的讨论 - 看来您希望 Example
实际参数通过在方法主体中分配它来更新 - 它不会 - 您只能对对象进行操作以影响它:.
为了完成这个主题,这里有一个解决方案可以继续您传递 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",Context.MODE_PRIVATE);
Gson gson = new Gson();
String json = sharedPreferences.getString("list", null);
Type type = new TypeToken<ArrayList<Example>>() {}.getType();
ArrayList<Example> t = gson.fromJson(json, type);
if (t != null) {
Examples.addAll(t);
}
}
我正在尝试创建一个 class,它将包含用于将对象的 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);
告诉我它是否有效
这解决了您发布的代码中的一个错误,即方法 loadData
方法中 Examples
参数的处理。
因为您 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);
不要引发 pass-by-value 与 pass-by-reference 的讨论 - 看来您希望 Example
实际参数通过在方法主体中分配它来更新 - 它不会 - 您只能对对象进行操作以影响它:.
为了完成这个主题,这里有一个解决方案可以继续您传递 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",Context.MODE_PRIVATE);
Gson gson = new Gson();
String json = sharedPreferences.getString("list", null);
Type type = new TypeToken<ArrayList<Example>>() {}.getType();
ArrayList<Example> t = gson.fromJson(json, type);
if (t != null) {
Examples.addAll(t);
}
}