尝试在SharedPreferences
中存储LocalDate
时遇到问题。使用Gson库,我将Task.java
(自定义类(实例列表转换为字符串,并将其写入SharedPreferences。Task实例包含LocalDate变量。检索该LocalDate变量时,它总是返回一个空字符串或设置为0000-00-00的日期。
当写&只读取LocalDate进行测试时,我遇到了同样的问题。
这是尝试它的代码:
LocalDate testDate = LocalDate.now();
System.out.println("TestDate before: " + testDate);
SharedPreferences.Editor editor = pref.edit();
Gson gson = new Gson();
editor.putString("testdate", gson.toJson(testDate));
System.out.println("TestDate String after: " + pref.getString("testdate", null));
LocalDate newtestDate = gson.fromJson(pref.getString("testdate", null), new TypeToken<LocalDate>(){}.getType());
System.out.println("TestDate as Date after: " + newtestDate);
我得到的输出:
I/System.out: TestDate before: 2021-03-27
I/System.out: TestDate String after: {}
I/System.out: TestDate as Date after: 0000-00-00
您需要commit()
或apply()
您的SharedPreferences.Editor
更改,以便它们实际存在于SharedPreferences
中进行读取。
此外,gson开箱即用不知道如何序列化LocalDate
s。您需要一个自定义的TypeAdapter
。请参阅使用Gson 将Java 8 LocalDate序列化为yyyy-mm-dd
添加到@lato令人敬畏的答案中,SharedPreferences.Editor的commit()
和apply()
在用例中存在重大差异。
commit()
是同步的,它返回一个表示成功或失败的布尔值。
apply()
是异步的,速度更快,并且不会返回任何内容。该函数是在2.3中添加的,是对commit((的改进,因此是更高效代码的选择。