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

Posted

技术标签:

【中文标题】更新 Android 应用程序时 SharedPreferences 会发生啥?【英文标题】:What will happen to the SharedPreferences on update an Android App?更新 Android 应用程序时 SharedPreferences 会发生什么? 【发布时间】:2012-09-20 04:54:27 【问题描述】:

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

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

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

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

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

编辑 2: 自从我第一次问这个问题以来,我最近了解到,从 android 6.0 (API 23) 开始,还可以使用自动备份功能来保护您的共享首选项,如 @987654322 所述@。

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

【问题讨论】:

【参考方案1】:

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

但必须与package name相同,才能检测为之前App的更新。

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

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

编辑

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

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

如果您想知道升级应用程序必须/可能会发生什么?,我没有对此进行任何好的描述。它与@比较复杂和相关987654330@,Application signing,copy protection 和其他主题。我的意思是,如果您在上述任何字段中更改您的应用程序的状态,它会导致不同的结果。 例如,如果您CHANGED COPY PROTECTION FROM ON to OFF OR OFF to ON,您的应用程序将被更新,但会导致您所有共享的首选项丢失,无法访问文件并且...... 您虽然必须注意条件,但您的新应用程序being considered 是旧应用程序的更新(请参阅Things That Cannot Change)。

另外你必须小心你的代码,它可能会导致删除你的数据库中的数据(见update app with preloaded SQLite)。

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

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

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

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

【讨论】:

谢谢,在我看来 SharedPreferences 应该保持正常。但是这个过程没有官方描述吗? @viperbone 哪个进程?明确共享偏好?或升级应用程序? 升级应用程序过程。升级应用程序时必须/可能发生的事情。 @viperbone 请再次查看我的回答。我添加了更多详细信息。 另一个注意事项:确保共享首选项名称在升级之间是相同的!我在版本之间有不同的名称,所以新版本没有从以前版本中提取保存的首选项......浪费了整个上午来调试这个...... :-(【参考方案2】:

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

显式设置 serialVersionUID 以避免此问题

static final long serialVersionUID = 42L;

【讨论】:

但请确保您的更改兼容,否则您可能会遇到奇怪的错误。【参考方案3】:

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

【讨论】:

以上是关于更新 Android 应用程序时 SharedPreferences 会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

Android - 应用更新时的 Firebase 远程配置缓存

应用程序空闲时如何在android中停止GPS更新?

屏幕关闭时,前台服务未在 Android 7.0+ 中接收位置更新

移动时 Android 位置更新

由两个应用程序共享时,库中的 Android 服务未更新

在 Android 运行时更新视图