共享偏好设置上的类转换异常

3

我得到了一个属性,它被持久化在共享偏好中。

整个代码中有2个地方与它有关:

firstRunTimestamp = wmbPreference.getLong(ApplicationData.ParametersInternals.FIRST_RUN_DATE, 0);

editor.putLong(ApplicationData.ParametersInternals.FIRST_RUN_DATE, new Date().getTime());

在我的日志中,我发现了这个异常

"java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Long at android.app.SharedPreferencesImpl.getLong("

堆栈指示此代码位于访问此属性的方法内部,有人能解释一下这是如何可能的吗?


在旧版本的基础上安装新版本之前,它是一个字符串,这种情况有可能发生吗? - auselen
2个回答

1

SharedPreference以键值对的形式存储所有数据,其中键和值都是字符串。如果您显式将值存储到SharedPreference中,则不是这样。请查看下面的回复。

您需要从字符串中解析出Long值:

firstRunTimestamp = Long.parseLong(wmbPreference.getString(ApplicationData.ParametersInternals.FIRST_RUN_DATE, "0")); //Notice here, the default value is also made a string. 

@auselen,这通常发生在使用Preference活动时。如果您明确将“Long”存储到首选项中,则不会出现问题。我应该在我的原始评论中添加它。 - Supreethks

1

检查您的preference.xml中是否存在具有相同键值的偏好设置。请注意,定义在preference.xml中的偏好设置始终存储为String值。


另一种解决方案-如果您首先将偏好键定义为运行时的int,然后稍后决定将相同的键定义为String,尽管您已更改了代码,但它可能会引发ClassCastException。这是因为此键在共享偏好文件中作为Int出现。为避免这种情况,请从您的代码或设备中删除共享偏好文件,具体取决于需求并重新安装您的应用程序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接