91

我已将用户设置存储在我的应用程序的 SharedPreferences 中。当我通过 Google Play 商店将应用程序更新到新版本的应用程序时,SharedPreferences 会发生什么情况?

更新后 SharedPrefernces 是否仍然存在或将被删除?

到目前为止,我还没有在网络或 Stackoverflow 上找到答案。

你能指出一些他们描述这个过程的链接吗?

编辑: 同时我也找到了另一个答案:SharedPreferences behavior on Update/Uninstall

编辑 2: 自从我第一次问这个问题以来,我最近了解到,从 Android 6.0 (API 23) 开始,也可以使用自动备份功能来保护您的共享偏好,如谷歌在此处所述。

只需allowBackup="true"在您的AndroidManifest.xml文件中添加。

4

3 回答 3

73

克里斯蒂安在这里说:当用户安装更新时,您的应用程序数据将保留。

但它必须与package name之前的应用程序的更新相同才能检测到。

EboMike 在警告 Android 用户应用程序更新可能导致旧应用程序版本丢失数据?说:

坦率地说,由于升级而丢失数据是不可接受的。

编辑

通常,SharedPreferences(以及其他用户数据)会在更新过程中保留,但有时,由于一些“未知”问题,数据可能会丢失,我猜它是你无法控制的。因此,您可以简单地相信 SharedPreferences 将被保留(参见此处)。

所以,如果你想避免在升级过程中清除用户数据,你必须将主要数据保存在外部存储中(这可以是可移动存储介质,如 SD 卡或内部、不可移动的存储。)而不是为您的应用程序私有。或者至少在升级之前为用户备份数据。然后在您(升级的)应用程序的第一次运行中,检查外部存储中是否有任何备份文件。

如果您想知道升级应用程序必须/可以发生什么事情?,我没有对此进行任何很好的描述。它与,,和其他主题是复杂和相关的。我的Android Security意思Application signingcopy protection如果您在上述任何字段中更改您的应用程序的状态,它会导致不同的结果。
例如,如果您CHANGED COPY PROTECTION FROM ON to OFF OR OFF to ON,您的应用程序将被更新,但会导致您的所有共享偏好丢失,文件访问是不可能的......。
尽管您必须注意条件导致您的新应用程序being considered作为以前应用程序的更新(请参阅无法更改的事情)。

此外,您必须注意您的代码,这可能会导致删除数据库中的数据(请参阅使用预加载的 SQLite 更新应用程序)。

但最终,如果小心,你可以说:

更新过程仅替换 apk 文件(以及其中的内容,例如可绘制文件,...)并且不会更改数据库、共享首选项和在运行时生成的任何其他文件(可能在这种情况下,新应用程序安装与前一个 App 的 UID 相同的 UID)。

您可以查看这些页面以获取更多详细信息:

帮助!?在市场上更新我们的应用程序会删除已保存的 SharedPreferences。
市场复制保护在更新后完全中断文件访问
有人可以解释应用程序更新过程吗?

于 2012-09-28T10:10:17.090 回答
9

经过 4 个多小时的调试后,我发现我通过序列化模型将模型保存为字符串。可序列化的类有一个名为 serialVersionUID的唯一 id ,默认情况下在运行时设置,id 由类名、接口名和变量名计算得出。我发现我更改了模型类,添加了一个变量,然后更新了应用程序。由于类现在已更改,因此设置了新的serialVersionUID并因此在 update 时,它​​无法反序列化字符串并创建模型并给出 java.io.InvalidClassException

显式设置 serialVersionUID 以避免此问题

static final long serialVersionUID = 42L;
于 2016-08-20T08:02:51.280 回答
5

我想当我上次通过 Google Play 更新我的应用程序时,sharedPreferences 没有受到影响。
我正在使用它们来自动登录,并且在更新后它就这样做了。
那是一个月前,我的记忆可能会变得模糊,所以最好也听听其他人的意见。

于 2012-09-28T10:09:24.827 回答