【问题标题】:Unable to load data from Shared Preferences after app update应用更新后无法从共享首选项加载数据
【发布时间】:2021-01-01 18:01:26
【问题描述】:

我在 Play 商店中有一个应用程序,其中 Shared Preference 条目存储为 json 字符串。我正在尝试更新应用程序,但我注意到在应用程序更新后我无法正确加载任何存储的共享首选项数据,这意味着如果更新,所有用户存储的首选项都将丢失。

假设我有这样的课程:

public class BrightnessSetting {
    public int systemAutoBrightness;
    public boolean customAutoBrightness;
    public int brightnessLevel;
    public float adjustmentLevel;
    public boolean playSound;
    public String soundFile;
}

此类的对象以 json 格式保存到应用程序的共享首选项中,这只是将其转换为长字符串。生成发布应用程序包时,它通过用字母替换变量名来缩小此字符串,因为它使用 ProGuard。这意味着最终结果将是这样的:{"a": 0, "b": false, "c": 25, "d": 0.0, "e": false}。经过测试,我发现没有 ProGuard 一切正常,但使用 ProGuard 我无法在应用程序更新后检索数据。共享首选项键仍然正确,它们对应的 json 字符串仍然正确,但是当我尝试将 json 字符串转换回其原始形式作为 BrightnessSetting 对象时,我得到一个空对象。

如何从 json 字符串中取回原始对象?

【问题讨论】:

  • stackoverflow.com/a/12637972/10002974 这可能对你有帮助。
  • 我阅读了该帖子中的第二个答案,即关于 serialVersionUID 的答案。我尝试搜索,但无法确定它是否是我的问题的根源,也找不到任何有关如何获取或设置类的 serialVersionUID 的信息。
  • 有什么想法吗? .. :)
  • 我已经被这个错误困住了 2 天。请帮忙

标签: java android json


【解决方案1】:

将此添加到您的 proguard 配置中:

-keepclassmembernames class your.path.to.BrightnessSetting

如果您使用 Gson 将您的类与字符串转换,您需要防止 proguard 混淆类的成员(Gson 需要这些成员才能工作)。

理想情况下,您应该以另一种方式存储您的信息,以便不必依赖这种方法。更新之间对 BrightnessSetting 的任何更改都可能会破坏向后兼容性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    相关资源
    最近更新 更多