更新Android应用程序后,SharedPreferences将会如何处理?


84

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

更新后,SharedPrefernces仍会存在还是会被删除?

到目前为止,我还没有在Web或Stackoverflow上找到答案(我可以使用错误的关键字进行搜索吗?)。

您能否指出一些他们描述此过程的链接?

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

编辑2: 自从我问这个问题已有一段时间以来,我最近才了解到,从Android 6.0(API 23)开始,还可以使用自动备份功能来保护您的共享首选项,如Google此处所述。只需allowBackup="true"AndroidManifest.xml文件中添加即可。

Answers:


70

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

但是它必须具有相同的功能,package name才能检测为先前App的更新。

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

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

编辑

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

因此,如果要避免在升级过程中清除用户数据,则必须将主数据保存在外部存储设备(可以是可移动存储介质,例如SD卡或内部不可移动存储设备)中,而不必对于您的应用程序是私有的。或者至少在升级之前不让用户备份数据。然后在您的(升级的)应用程序的首次运行中,检查外部存储中是否有备份文件。

如果您想知道升级应用程序必须/会发生什么?,我没有什么好介绍的this.It是复杂的和相对有Android SecurityApplication signingcopy protection和其他topics.I意味着,如果你在任何上述领域改变你的应用程序的状态,它会导致不同的结果。
例如,如果您CHANGED COPY PROTECTION FROM ON to OFF OR OFF to ON将更新您的应用程序,但会导致所有共享首选项丢失,则无法进行文件访问...。
尽管您必须小心一些条件,但会导致您的新Appbeing considered作为先前App的更新(请参阅无法更改的内容)。

另外,您还必须注意自己的代码,这可能是导致删除数据库数据的原因(请参阅使用预加载的SQLite更新应用程序)。

但最终,如果小心一点,您可以说:

更新过程仅替换apk文件(因此包含其中的内容,例如drawables等),并且不会更改数据库,sharedpreferences和运行时生成的任何其他文件(可能在这种情况下,新App安装为等于先前应用程序的UID的UID)。

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

救命!?在市场上更新我们的应用程序会删除保存的SharedPreferences。
市场复制保护在更新后完全破坏了文件访问权限
有人可以解释应用程序更新过程吗?


谢谢,在我看来,SharedPreferences应该保持正常。但是,此过程没有官方描述吗?
布鲁诺·比耶里

@viperbone哪个进程?声明共享首选项?还是升级App?
hasanghaforian 2012年

升级应用程序过程。升级应用程序时必须/可能发生什么事情。
Bruno Bieri 2012年

@viperbone请再次查看我的答案。我添加了更多详细信息。
hasanghaforian 2012年

另一个注意事项:确保共享的首选项名称在两次升级之间相同!我有版本之间不同的名称,因此新版本不拾取从以前版本所保存的喜好......浪费了一上午调试这... :-(
henry000dev

7

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

明确设置serialVersionUID以避免此问题

static final long serialVersionUID = 42L;

1
但是,请确保您所做的更改是兼容的,否则您可能会遇到奇怪的错误。
mjaggard

5

我想上次通过Google Play更新应用程序时,sharedPreferences并未受到影响。
我使用它们来自动登录,并且在更新后就这样做了。
一个月前,我的记忆可能变得模糊,因此最好也听听别人的意见。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.