更新 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 远程配置缓存