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()

  1. 您必须在应用关闭时保存预算而不是 onResume()Check this Android Activity Lifecycle.
  2. 此外,我认为您不应该使用硬编码字符串作为键。尝试使用 Android docs 中的字符串资源。如果您在 'key' 中输入错误,您将获得默认值。
  3. 如果您保存预算然后将其加载到另一个 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);
}