Android写入和读取LocalDate到和从SharedPreferences的麻烦



尝试在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开箱即用不知道如何序列化LocalDates。您需要一个自定义的TypeAdapter。请参阅使用Gson 将Java 8 LocalDate序列化为yyyy-mm-dd

添加到@lato令人敬畏的答案中,SharedPreferences.Editor的commit()apply()在用例中存在重大差异。

commit()是同步的,它返回一个表示成功或失败的布尔值。

apply()是异步的,速度更快,并且不会返回任何内容。该函数是在2.3中添加的,是对commit((的改进,因此是更高效代码的选择。

相关内容

  • 没有找到相关文章

最新更新