web-dev-qa-db-fra.com

Qu'adviendra-t-il des SharedPreferences lors de la mise à jour d'une application Android?

J'ai enregistré les paramètres utilisateur dans les préférences partagées de mon application. Que se passera-t-il avec les préférences partagées lorsque je mettrai à jour l'application via Google Play Store vers une nouvelle version de l'application?

Les SharedPrefernces seront-ils toujours là après la mise à jour ou seront-ils supprimés?

Jusqu'à présent, je n'ai pas trouvé de réponse sur le Web ou sur Stackoverflow (puis-je rechercher avec des mots clés incorrects?).

Pouvez-vous m'indiquer quelques liens qui décrivent ce processus?

Edit: Pendant ce temps, j'ai aussi trouvé une autre réponse: Comportement SharedPreferences sur Update/Uninstall

Edit 2: Depuis que le temps a passé un peu quand j'ai posé cette question pour la première fois, j'ai récemment appris que depuis Android 6.0 ( API 23), il est également possible d'utiliser la fonctionnalité de sauvegarde automatique pour sécurisé vos préférences partagées comme décrit par Google ici . Ajoutez simplement le allowBackup="true" dans votre AndroidManifest.xml fichier.

80
Bruno Bieri

Cristian ici dit: vos données d'application seront conservées lorsque l'utilisateur installera les mises à jour.

Mais ça doit être avec le même package name à détecter comme une mise à jour de l'application précédente.

EboMike dans Avertissement Android que la mise à jour de l'application pourrait entraîner la perte de données de l'ancienne version de l'application? dit:

Franchement, la perte de données en raison d'une mise à niveau est inacceptable.

Modifier :

Normalement , les SharedPreferences (ainsi que d'autres données utilisateur) seront conservées pendant le processus de mise à jour, mais parfois, en raison de certains " inconnu "problème, les données peuvent être perdues, et je suppose qu'elles sont hors de votre contrôle. Donc, vous pouvez simplement croire que les SharedPreferences seront conservées ( voir ici ).

Donc, si vous voulez éviter d'effacer les données de l'utilisateur lors de la mise à niveau, vous devez enregistrer les données principales dans un stockage externe (il peut s'agir d'un support de stockage amovible, comme une carte SD ou un stockage interne non amovible) et non privé pour votre application ou au moins mis de côté pour que l'utilisateur sauvegarde les données avant de mettre à niveau.

Si vous aimez savoir Quelles choses doivent/peuvent se produire lors de la mise à niveau d'une application?, je n'ai pas de bonne description C'est compliqué et relatif avec Android Security, Application signing, copy protection et d'autres sujets. Je veux dire que si vous changez l'état de votre application dans l'un des champs ci-dessus, cela entraîne un résultat différent.
Par exemple, si vous CHANGED COPY PROTECTION FROM ON to OFF OR OFF to ON, votre application sera mise à jour, mais toutes vos préférences partagées seront perdues, l'accès aux fichiers sera impossible et ....
Bien que vous deviez faire attention aux conditions, votre nouvelle application being considered comme mise à jour pour l'application précédente (voir Choses qui ne peuvent pas changer ).

Vous devez également faire attention à votre code, cela peut être dû à la suppression des données de vos bases de données (voir mise à jour de l'application avec SQLite préchargé ).

Mais finalement, si vous faites attention, vous pouvez dire:

Le processus de mise à jour ne remplace que le fichier apk (et donc ce qu'il contient, par exemple des tirages, ...) et ne modifie pas les bases de données, les préférences partagées et tout autre fichier généré en cours d'exécution (probablement dans ce cas, une nouvelle application est installée avec l'UID qui est égal à l'UID de l'application précédente).

Vous pouvez voir ces pages pour plus de détails:

Aide !? La mise à jour de notre application sur le marché supprime les SharedPreferences enregistrées.
La protection contre la copie commerciale interrompt totalement l'accès aux fichiers après la mise à jour
Quelqu'un peut-il expliquer le processus de mise à jour de l'application?

67
hasanghaforian

Je pense que lorsque j'ai mis à jour mon application la dernière fois via Google Play, les préférences partagées n'ont pas été affectées.
Je les utilisais pour me connecter automatiquement, et après la mise à jour, il l'a fait.
C'était il y a un mois, ma mémoire pouvait devenir floue donc il vaut mieux entendre les opinions des autres aussi.

5
Lazy Ninja

Après avoir débogué pendant plus de 4 heures, j'ai découvert que j'enregistrais un modèle en tant que chaîne en le sérialisant. Une classe sérialisable a un identifiant unique par son nom serialVersionUID, qui est défini par défaut au moment de l'exécution et l'identifiant est calculé par le nom de la classe, les interfaces et les noms de variables également. J'ai découvert que j'ai changé la classe de modèle, ajouté une variable, puis mis à jour l'application. Comme la classe est maintenant modifiée, une nouvelle serialVersionUID a été définie et donc lors de la mise à jour, elle n'a pas pu désérialiser la chaîne et créer le modèle et a donné Java.io.InvalidClassException

Définissez explicitement serialVersionUID pour éviter ce problème

static final long serialVersionUID = 42L;
5
abhishek