SharedPreferences 总是返回自定义对象的默认值
SharedPreferences always returning default value for custom object
我正在制作一个简单的预算跟踪应用程序。我有一个预算 class,它存储了一些变量:预算的金额、持续时间和初始值。我在片段中只有一个全局预算对象,称为“预算”,并试图保存它。它似乎保存得很好,但是当我尝试检索它时,由于某种原因它 returns 默认值。这是我保存和加载的方法。我只在 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);
}
我的日志针对我当前的 Budget 实例说明了这一点:
D/BTAG: JSON: {"amount":35.92,"frequency":"monthly","originalAmount":35.92}
D/BTAG: gson from json: null
这表明保存没有问题,但加载不起作用。为什么 getBudget() 不起作用?
我认为问题可能出在:
only call saveBudget
in onResume()
- 您必须在应用关闭时保存预算而不是
onResume()
。 Check this Android Activity Lifecycle.
- 此外,我认为您不应该使用硬编码字符串作为键。尝试使用 Android docs 中的字符串资源。如果您在 'key' 中输入错误,您将获得默认值。
- 如果您保存预算然后将其加载到另一个 activity 中,问题可能在于获取
SharedPreferences
实例。要获得 SharedPreferences
使用:
SharedPreferences sP = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences from different activity
你可以试试这个,我希望这会编译:
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);
}
我正在制作一个简单的预算跟踪应用程序。我有一个预算 class,它存储了一些变量:预算的金额、持续时间和初始值。我在片段中只有一个全局预算对象,称为“预算”,并试图保存它。它似乎保存得很好,但是当我尝试检索它时,由于某种原因它 returns 默认值。这是我保存和加载的方法。我只在 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);
}
我的日志针对我当前的 Budget 实例说明了这一点:
D/BTAG: JSON: {"amount":35.92,"frequency":"monthly","originalAmount":35.92}
D/BTAG: gson from json: null
这表明保存没有问题,但加载不起作用。为什么 getBudget() 不起作用?
我认为问题可能出在:
only call
saveBudget
inonResume()
- 您必须在应用关闭时保存预算而不是
onResume()
。 Check this Android Activity Lifecycle. - 此外,我认为您不应该使用硬编码字符串作为键。尝试使用 Android docs 中的字符串资源。如果您在 'key' 中输入错误,您将获得默认值。
- 如果您保存预算然后将其加载到另一个 activity 中,问题可能在于获取
SharedPreferences
实例。要获得SharedPreferences
使用:
SharedPreferences sP = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences from different activity
你可以试试这个,我希望这会编译:
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);
}