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

时间:2012-09-28 09:56:21

标签: android sharedpreferences updates

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

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

到目前为止,我还没有在网络或Stackoverflow上找到答案(我可能会搜索错误的关键字吗?)。

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

修改 与此同时,我也找到了另一个答案:SharedPreferences behaviour on Update/Uninstall

编辑2: 自从我第一次提出这个问题以来,我最近了解到,自从Android 6.0(API 23)以来,我们也可以使用自动备份功能来保护您的共享首选项,如{{ 3}}。只需在allowBackup="true"文件中添加AndroidManifest.xml即可。

3 个答案:

答案 0 :(得分:67)

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

但它必须使用相同的package name来检测以前App的更新。

Warning Android user that app update could lead to losing data from old app version?中的EboMike说:

  

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

修改

通常,在更新过程中将保留SharedPreferences(以及其他用户数据),但有时,由于某些“ unknown ”问题,数据可能会迷路,我想这是你无法控制的。因此,您可以简单地相信将保留SharedPreferences(see here)。

因此,如果您想避免在升级过程中清除用户数据,则必须将主数据保存在外部存储中(这可以是可移动存储介质,例如SD卡或内部不可移动存储。并且不是私有的App.Or至少放弃用户备份数据升级之前。然后在你的(升级)应用程序的第一次运行,检查外部存储中是否有任何备份文件或没有。

如果您想知道 升级应用程序必须/可能发生什么事情? ,我对此没有任何好的描述。它很复杂且与{相关} {1}},Android SecurityApplication signing和其他主题。我的意思是,如果您在上述任何字段中更改应用的状态,则会导致不同的结果。
例如,如果您copy protection,您的应用将会更新但会导致您的所有共享偏好丢失,无法访问文件并且......。
您虽然必须小心条件导致您的新应用CHANGED COPY PROTECTION FROM ON to OFF OR OFF to ON作为之前应用的更新(请参阅Things That Cannot Change)。

此外,您必须小心您的代码,这可能会导致删除数据库的数据(请参阅update app with preloaded SQLite)。

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

  

更新过程仅替换apk文件(以及其中的内容)   示例drawables,...)并且不会改变数据库,共享偏好   以及在运行时生成的任何其他文件(可能在此   例如,使用等于UID的UID安装新的App   以前的应用程序。)

您可以查看这些页面了解更多详情:

Help!? Updating our applicatoin on the market deletes the saved SharedPreferences.
Market copy protection totally breaks file access after updating
Can someone explain the App update process?

答案 1 :(得分:5)

我认为,当我上次通过Google Play更新我的申请时,sharedPreferences不会受到影响 我正在使用它们自动登录,更新后它就这样做了 那是一个月前,我的记忆力会变得模糊,所以最好还是听听别人的意见。

答案 2 :(得分:4)

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

明确设置serialVersionUID以避免此问题

static final long serialVersionUID = 42L;