Android 应用程序更新后SharedReference丢失

Android 应用程序更新后SharedReference丢失,android,sharedpreferences,Android,Sharedpreferences,我一整天都在研究这个问题。以下是要点: 当用户进行应用程序更新时,SharedReferences应该是持久的 在我的情况下,在更新应用程序后,它们将丢失 每次(我从Play Store安装旧的APK,然后adb安装-r new.APK和新的(更新的、签名的、版本代码增加的)APK)都可以复制该问题 8小时后 对于测试,我更改了new.apk(SP2.xml)中的SharedPrefs文件名,并且在更新后,从old.apk(SP.xml)中删除了旧的SharedPrefs文件以下是adb外

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

  • 当用户进行应用程序更新时,SharedReferences应该是持久的
  • 在我的情况下,在更新应用程序后,它们将丢失
  • 每次(我从Play Store安装旧的APK,然后
    adb安装-r new.APK
    和新的(更新的、签名的、版本代码增加的)APK)都可以复制该问题

8小时后

对于测试,我更改了
new.apk
(SP2.xml)中的SharedPrefs文件名,并且在更新后,从
old.apk
(SP.xml)中删除了旧的SharedPrefs文件以下是adb外壳输出:

  • adb安装旧的.apk

  • adb shell“su-c'ls/data/data/com.pkg.name/shared_prefs'”
    : CRC.xml

  • adb安装-r new.apk

  • adb shell“su-c'ls/data/data/com.pkg.name/shared_prefs'”
    : CRC2.xml(CRC.xml丢失!)

  • My SharedReferences单例类(init:
    SharedRefers.init(getApplicationContext());
    ):


    所以基本上我失去了共享参考,我不知道为什么。请帮忙,任何提示欢迎

    如果您更改了清单文件的应用程序部分中的属性,则会发生此错误,并且90%的时间会重置共享的pref数据。这是我在play store应用程序上安装签名apk的测试中发现的。不确定如果该应用程序是作为更新从play store安装的,会发生什么情况,但我非常确定在这种情况下数据也会丢失


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

    您的应用程序包名称是否与以前的相同?或者在共享首选项中将序列化模型类保存为字符串?是的,包名称相同(否则我将无法在Play Store上更新应用程序)。但是,我已经更改了
    s
    android:label
    (应用程序的名称)。是否将序列化模型类保存为共享首选项中的字符串?检索共享首选项对象的代码是什么样子的?请尝试从android studio安装应用程序,它将显示一个对话框,提示您卸载现有应用程序。试一试,你就会看到错误信息。这应该是一个评论,而不是一个答案,因为它不是基于事实和大量的不确定性。我在play store上发布并验证了这一点。我今天已经确认了。此外,考虑到几乎没有其他人指出这一点,我认为强调这一点很重要。我花了很长时间才明白这对我来说是可行的。你救了我,伙计,我快疯了。我的应用程序保持脱机数据,在更新到SDK 28后,我丢失了所有数据。如何防止错误发生?我有清单数据需要随更新而更改。这太奇怪了,而且在任何地方都没有记录!真令人难以置信!为了避免这种情况,我认为JetPack的新数据存储可能是一个很好的解决方案。尽管您必须自己对数据进行加密(目前是alpha格式)。
    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);
        }
        ...
    }