2012-09-28 69 views
59

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

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

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

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

编辑: 同时我发现对方的回答太:SharedPreferences behaviour on Update/Uninstall

编辑2: 由于时间过去颇有几分当我第一次问这个问题,笔者近日了解到,由于Android 6.0(API 23 )也可以使用自动备份功能安全您的共享首选项,如Google here所述。只需在您的AndroidManifest.xml文件中添加allowBackup="true"即可。

回答

57

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

但它必须与package name一样检测为以前的应用程序的更新。

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

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

编辑

通常,所述SharedPreferences(以及其它用户数据)将在更新过程中被保持,但有时,由于一些“未知”的问题,该数据可能会丢失,我想它已经超出了你的控制范围。所以,你可以简单地相信SharedPreferences将被保留(see here)。

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

如果你想知道什么事情必须/可以发生在升级一个应用程序?,我对此没有任何好的描述。它与Android Security,Application signing,copy protection和其他topics.I的意思是,如果你改变你的应用程序的状态在任何上述领域是复杂和相对的,它会导致不同的结果。
例如,如果你CHANGED COPY PROTECTION FROM ON to OFF OR OFF to ON,你的应用程序将被更新,但会导致你所有的共享首选项丢失,文件访问是不可能的,...。
你虽然必须在条件关心导致您的新应用程序being considered作为以前的应用程序的更新(见Things That Cannot Change)。

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

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

更新过程只替换apk文件(因此它是什么的 例如绘图资源,...),不更改数据库,共享首选项 和运行时生成的任何其他文件(可能在此 的情况下,新应用程序安装的UID等于UID 以前的应用程序)。

你可以看到这些网页了解详情:

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?

+0

谢谢,在我看来SharedPreferences应该保持良好状态。但是这个过程没有官方描述吗? –

+0

@viperbone哪个进程?clareing sharedpreferences?或升级应用程序? – hasanghaforian

+0

升级应用程序进程。升级应用程序必须/可能发生什么事情。 –

4

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

4

调试超过4小时后,我发现,我被其序列保存模型作为字符串。可序列化的类具有唯一的名称 serialVersionUID,它在运行时默认设置,id也由类名,接口名和变量名计算。我发现我改变了模型类,添加了一个变量,然后更新了应用程序。由于该类现在改变这样一个新的的serialVersionUID设置,因此在更新后,它不能反序列化的字符串,并创建模型,并给予java.io.InvalidClassException

明确设置的serialVersionUID以避免这种问题

static final long serialVersionUID = 42L; 
相关问题