【问题标题】:SharedPreferences lost after app update应用更新后 SharedPreferences 丢失
【发布时间】:2018-12-10 15:24:59
【问题描述】:

我整天都在研究这个问题。以下是重点:

  • SharedPreferences应该在用户更新应用时保持不变
  • 在我的情况下,更新应用程序后,它们丢失了
  • 每次都可以重现该问题(我从 Play 商店安装旧 APK,然后使用新的(更新、签名、版本代码递增)APK 安装 adb install -r new.apk

8 小时后

为了测试,我更改了 new.apk (SP2.xml) 中的 SharedPrefs 文件名,并且在更新时,old.apk (SP.xml) 中的旧 SharedPrefs 文件被删除了!这是 adb shell 输出:

  1. adb install old.apk

  2. adb shell "su -c 'ls /data/data/com.pkg.name/shared_prefs'": CRC.xml

  3. adb install -r new.apk

  4. adb shell "su -c 'ls /data/data/com.pkg.name/shared_prefs'": CRC2.xml(缺少CRC.xml!)

我的 SharedPreferences 单例类(初始化:SharedPrefs.init(getApplicationContext());):

public final class SharedPrefs {
    private static SharedPrefs sp;

    private SharedPrefs() {
    }

    public static void init(Context context) {
        if (sp == null)
            sp = context.getSharedPreferences("CRC2", Context.MODE_PRIVATE);
    }

    public static void saveString(String name, String value) {
        sp.edit().putString(name, value).apply();
    }

    public static String getString(String key, String defaultValue) {
      sp.getString(key, defaultValue);
    }
    ...
}

所以基本上我失去了 SharedPreferences 并且我不知道为什么。请帮忙,欢迎任何提示!

【问题讨论】:

  • 你的应用包名和之前的一样吗?或者您将序列化模型类保存为共享首选项中的字符串?
  • 是的,包名相同(否则我将无法在 Play 商店中更新应用)。但是,我更改了 <application>s android:label(应用名称)。
  • 您是否将序列化模型类保存为共享首选项中的字符串?
  • 检索共享首选项对象的代码是什么样的?
  • 尝试从你的 android studio 安装应用程序,它会显示一个对话框,它将卸载现有的应用程序。试试看,你会看到错误信息。

标签: android sharedpreferences


【解决方案1】:

如果您在清单文件的应用程序部分更改了属性,则会发生此错误,并且在 90% 的情况下,共享首选项数据将被重置。这是我在我的 Play 商店应用程序顶部安装签名 apk 的测试中发现的。不确定如果从 Play 商店安装该应用程序作为更新会发生什么,但我很确定在这种情况下数据也会丢失。

编辑-我重新发布了应用程序并进行了多次测试。这实际上就是问题所在。

【讨论】:

  • 这应该是一个评论,而不是一个答案,因为它不是基于事实和很多不确定性。
  • 我在play store上发表并验证了这一点。我今天已经确认了。此外,考虑到几乎没有其他人指出这一点,认为强调这一点很重要。我花了很长时间才弄明白
  • 为我工作。你救了我的一天,我快疯了。我的应用程序保留离线数据,更新到 SDK 28 后我失去了一切。
  • 如何防止错误发生?我有清单数据需要随着更新而改变。
  • 这太奇怪了,任何地方都没有记录!真是令人难以置信!为了避免这种情况,我认为 JetPack 的新 DataStore 可能是一个很好的解决方案。虽然您必须自己加密数据(目前处于 alpha 阶段)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多