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,然后
和新的(更新的、签名的、版本代码增加的)APK)都可以复制该问题adb安装-r new.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.xmladb安装-r new.apk
adb shell“su-c'ls/data/data/com.pkg.name/shared_prefs'”
:
CRC2.xml(CRC.xml丢失!)SharedRefers.init(getApplicationContext());
):
所以基本上我失去了共享参考,我不知道为什么。请帮忙,任何提示欢迎 如果您更改了清单文件的应用程序部分中的属性,则会发生此错误,并且90%的时间会重置共享的pref数据。这是我在play store应用程序上安装签名apk的测试中发现的。不确定如果该应用程序是作为更新从play store安装的,会发生什么情况,但我非常确定在这种情况下数据也会丢失
编辑-我重新发布了应用程序并进行了多次测试。事实上,这就是问题所在 您的应用程序包名称是否与以前的相同?或者在共享首选项中将序列化模型类保存为字符串?是的,包名称相同(否则我将无法在Play Store上更新应用程序)。但是,我已经更改了
sandroid: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);
}
...
}