java - SharedPreferences 始终返回自定义对象的默认值

标签 java android sharedpreferences

我正在制作一个简单的预算跟踪应用程序。我有一个 Budget 类,它存储一些变量:预算的金额、持续时间和初始值。我在 fragment 中只有一个全局预算对象,称为“预算”,并且正在尝试将其保存。它似乎保存得很好,但是当我尝试检索它时,它由于某种原因返回默认值。这是我的保存和加载方法。我只在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() 不起作用?

最佳答案

我认为问题可能出在:

only call saveBudget in onResume()

  1. 您必须在应用关闭时保存预算,而不是在 onResume() 中。 Check this Android Activity Lifecycle .
  2. 此外,我认为您不应该使用硬编码字符串作为 key 。尝试使用字符串资源,如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);
}

关于java - SharedPreferences 始终返回自定义对象的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62922086/

相关文章:

android - 重复使用 Android Shared Preference 存储会影响性能吗?

android - 如何检索 XML 文件中定义的首选项的默认值

java - Eclipse 的代码感知风格自动完成

java - 这行代码在java中是如何执行的?

java - getCacheDir() 下的子目录

android - 如何实现多个fragments的滑动tab导航

java - 另一个 Activity 中的单选按钮仍然为空?

java - 在java中为系统托盘创建单个实例

android - 基因运动。如何从设备中提取数据库。我的/数据/数据/文件夹似乎是空的

android - 在 Eclipse 中仅调试您的 Android 源代码