gson Android向SharedPreferences写入和从SharedPreferences阅读LocalDate的问题

h9a6wy2h  于 2022-11-06  发布在  Android
关注(0)|答案(2)|浏览(259)

我在尝试将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
vaj7vani

vaj7vani1#

你需要对commit()apply()进行修改,以便它们实际上在SharedPreferences中进行阅读。
另外,gson不知道如何序列化LocalDate。您需要一个定制的TypeAdapter来实现这一点。请参见Serialize Java 8 LocalDate as yyyy-mm-dd with Gson

qfe3c7zg

qfe3c7zg2#

@lato给出了一个很棒的答案,SharedPreferences.Editor的commit()apply()在用例上有很大的不同。
commit()是同步的,它返回一个指示成功或失败的布尔值。
apply()是异步的,速度更快,并且不返回任何内容。该函数是Python 2.3中添加的,作为对commit()的改进,因此是更高效代码的选择。

相关问题