当更新Android应用程序时,SharedPreferences会发生什么?

92

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

更新后,SharedPrefernces是否仍然存在,还是它们将被删除?

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

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

编辑: 同时,我也找到了另一个答案:SharedPreferences在更新/卸载时的行为

编辑2: 时光飞逝,当我第一次提出这个问题时,最近我学到了自Android 6.0(API 23)以来,也可以使用自动备份功能来存储您的共享首选项,如Google所述

只需在AndroidManifest.xml文件中添加<application android:allowBackup="true" ... >

3个回答

76

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

但必须使用相同的包名才能检测到先前应用程序的更新。

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

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

编辑:

通常情况下,SharedPreferences(以及其他用户数据)将在更新过程中保留,但有时由于某些“未知”问题,数据可能会丢失,我想这超出了您的控制范围。因此,您可以简单地相信SharedPreferences将被保留(请参见此处)。

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

如果您想知道在升级应用程序时可能发生什么事情?,我没有任何好的描述。它与Android安全性应用签名拷贝保护和其他主题有关。我的意思是,如果您在任何上述领域更改应用程序状态,它会导致不同的结果。
例如,如果您将拷贝保护从打开到关闭或从关闭到打开,则应用程序将被更新,但会导致所有共享首选项丢失,文件访问不可能等等。尽管您需要注意一些条件,因为您的新应用程序 被视为 前一个应用程序的更新(请参见不能更改的内容)。

此外,您需要注意代码,因为它可能会导致删除数据库中的数据(请参见使用预加载的SQLite更新应用程序)。

但最终,如果小心谨慎,您可以这样说:

更新进程仅替换apk文件(例如其中包含的drawable等),不会更改数据库、共享首选项和在运行时生成的任何其他文件(在这种情况下,新应用程序将安装具有与先前应用程序相同的UID)。

您可以查看以下页面以了解更多详细信息:

帮助!? 在市场上更新我们的应用程序会删除保存的SharedPreferences。
市场拷贝保护在更新后完全破坏文件访问权限
有人能解释一下应用程序更新过程吗?


谢谢,对我来说SharedPreferences应该是没问题的。但是没有官方的描述这个过程吗? - Bruno Bieri
@viperbone 是说哪一个进程?是清除SharedPreferences吗?还是升级应用程序? - hasanghaforian
应用程序升级过程。在升级应用程序时可能发生的事情有哪些? - Bruno Bieri
@viperbone 请再看一下我的回答,我添加了更多细节。 - hasanghaforian
另外注意:确保在升级时共享偏好设置的名称相同!我在不同版本之间使用了不同的名称,因此新版本无法获取先前版本保存的偏好设置...浪费了整个早上来调试这个问题... :-( - henrykodev

9
经过四个多小时的调试,我发现我将一个模型序列化后以字符串形式保存。一个可序列化的类有一个名为 serialVersionUID 的唯一标识符,默认情况下在运行时设置,该标识符由类、接口和变量名称计算得出。我发现我更改了模型类,添加了一个变量,然后更新了应用程序。由于类已更改,因此设置了一个新的 serialVersionUID,因此在更新时无法反序列化字符串并创建模型,并且会产生 java.io.InvalidClassException 错误。
为避免此问题,请明确设置 serialVersionUID。
static final long serialVersionUID = 42L;

1
但是请确保您的更改是兼容的,否则可能会出现奇怪的错误。 - mjaggard

6

我认为在上次通过Google Play更新我的应用程序时,sharedPreferences没有受到影响。

我使用它们来自动登录,在更新后也能够正常工作。

这是一个月前的事情了,我的记忆可能有点模糊,因此最好听听其他人的意见。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接