SharedPreferences 在 apply() 之后更改设置值

SharedPreferences change set values after apply()

变量声明

public String am_PM1, am_PM2;
        
public static final String AM_PM1 = "";
public static final String AM_PM2 = "";

我有 2 个字符串值被放入 sharedPreferences,但在它们被放入并应用后,本例中的第二个值 AM_PM2 覆盖 AM_PM1。如果我更改执行顺序并将 AM_PM2 放在 AM_PM1 之前,那么 AM_PM1 会覆盖第一个值。

Log.d("lol", "Value before 1: " + am_PM1);
Log.d("lol", "Value before 2: " + am_PM2);

editor.putString(AM_PM1, am_PM1);
editor.putString(AM_PM2, am_PM2);

editor.apply();

Log.d("lol", "" + sharedPreferences.getAll());

Log.d("lol", "Value after 1: " + sharedPreferences.getString(AM_PM1, ""));
Log.d("lol", "Value after 2: " + sharedPreferences.getString(AM_PM2, ""));

控制台输出截图:

第一次这样做,我没有意识到分配给变量的实际字符串值很重要。所以,如果你遇到这样的问题,请确保你没有像我一样傻,并且实际上已经为变量分配了一个字符串值。

public static final String AM_PM1 = "amPM1";
public static final String AM_PM2 = "amPM2";

SharedPreferences 使用 Key-Value 对来存储数据。如果您的密钥相同,则意味着每次写入一个值时,您都会覆盖前一个值。因此,当您尝试检索它们时,会给您意想不到的值。

AM_PM1 & AM_PM2 相等。删除 public static final String AM_PM1 = ""; & public static final String AM_PM2 = ""; 这样做:

  editor.edit().putString("AM_PM1", am_PM1).apply();
  editor.edit().putString("AM_PM2", am_PM2).apply();