我正在制作一个简单的预算跟踪应用程序。我有一个Budget类,它存储了一些变量:预算的金额、持续时间和初始值。我在片段中只有一个全局预算对象,称为"预算";预算";,我正试图挽救它。它看起来保存得很好,但当我尝试检索它时,由于某种原因,它会返回默认值。以下是我保存和加载的方法。我只在onCreateView中调用getBudget((,只在onResume((和预算编辑后调用saveBudget。注意日志条目。
public void saveBudget(){
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.clear();
Gson gson = new Gson();
String json = gson.toJson(budget);
Log.d("BTAG", "JSON: " + json);
editor.putString("current budget", json);
editor.commit();
}
public Budget getBudget(){
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
Gson gson = new Gson();
String json = sharedPref.getString("current budget", null);
Log.d("BTAG", "gson from json: " + gson.fromJson(json, Budget.class));
return gson.fromJson(json, Budget.class);
}
我的日志显示了我当前的预算实例:
D/BTAG: JSON: {"amount":35.92,"frequency":"monthly","originalAmount":35.92}
D/BTAG: gson from json: null
这表明它保存时没有问题,但加载不起作用。为什么getBudget((不起作用?
我认为问题可能在:
仅在
onResume()
中调用saveBudget
- 当应用程序不在
onResume()
中关闭时,您必须保存预算。检查此Android活动生命周期 - 另外,我认为您不应该使用硬编码字符串作为关键字。尝试像在Android文档中那样使用字符串资源。如果您在"key"中出错,您将获得默认值
- 如果您节省了预算,然后将其加载到另一个活动中,那么问题可能是获取
SharedPreferences
实例。要获得SharedPreferences
,请使用:
SharedPreferences sP = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
来自不同活动的SharedPreferences
你可以试试这个,我希望这个能编译:
public static final String SHARED_PREFS = "NAME_OF_SP";
public static final String NAME_OF_VAL = "budget";
public void saveBudget()
{
SharedPreferences sharedPref = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
Gson gson = new Gson();
String json = gson.toJson(budget);
Log.d("BTAG", "JSON: " + json);
editor.putString(NAME_OF_VAL, json);
editor.apply();
}
public Budget getBudget()
{
SharedPreferences sharedPref = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
Gson gson = new Gson();
String json = sharedPref.getString(NAME_OF_VAL, null);
Log.d("BTAG", "gson from json: " + gson.fromJson(json, Budget.class));
return gson.fromJson(json, Budget.class);
}