我在尝试将LocalDate
存储到SharedPreferences
时遇到了问题。我使用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
2条答案
按热度按时间vaj7vani1#
你需要对
commit()
或apply()
进行修改,以便它们实际上在SharedPreferences
中进行阅读。另外,gson不知道如何序列化
LocalDate
。您需要一个定制的TypeAdapter
来实现这一点。请参见Serialize Java 8 LocalDate as yyyy-mm-dd with Gsonqfe3c7zg2#
@lato给出了一个很棒的答案,SharedPreferences.Editor的
commit()
和apply()
在用例上有很大的不同。commit()
是同步的,它返回一个指示成功或失败的布尔值。apply()
是异步的,速度更快,并且不返回任何内容。该函数是Python 2.3中添加的,作为对commit()的改进,因此是更高效代码的选择。