【发布时间】: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 输出:
adb install old.apkadb shell "su -c 'ls /data/data/com.pkg.name/shared_prefs'": CRC.xmladb install -r new.apkadb 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>sandroid:label(应用名称)。 -
您是否将序列化模型类保存为共享首选项中的字符串?
-
检索共享首选项对象的代码是什么样的?
-
尝试从你的 android studio 安装应用程序,它会显示一个对话框,它将卸载现有的应用程序。试试看,你会看到错误信息。