Dans ce chapitre, nous allons étudier comment sauvegarder localement certaines informations pertinentes, telles que le score de l'utilisateur et son prénom. Ainsi, lorsque le joueur relancera l'application, nous pourrons le saluer et lui proposer d'améliorer son score précédent.
La gestion des préférences
Description
L'API mise à disposition par Android pour sauvegarder des informations locales à l'application s'appelle SharedPreferences. C'est une couche d'abstraction qui vous facilite la vie : elle récupère les données que vous lui passez, et les stocke dans un fichier XML.
L'API offre la possibilité d'utiliser différents fichiers pour stocker les informations. C’est très pratique dans une application importante avec des données très variées.
Pour accéder à l'instance de SharedPreferences, il suffit d'appeler la méthode getSharedPreferences() sur l'activité courante, en lui fournissant le nom du fichier dans lequel sauvegarder les données, comme ceci :
SharedPreferences preferences = getSharedPreferences(SHARED_PREF_USER_INFO, MODE_PRIVATE);
N’oubliez pas de créer la constante qui représente le nom de fichier en haut de la classe :
private static final String SHARED_PREF_USER_INFO = "SHARED_PREF_USER_INFO";
Le paramètre MODE_PRIVATE permet de préciser que les données du fichier sont accessibles seulement par notre application. Encore heureux ! Eh oui, historiquement il existait d'autres modes qui permettaient à des applications tierces de venir lire et écrire dans votre fichier. C'est scandaleux, n'est-ce pas ? Je suis bien d'accord avec vous ! C'est pourquoi Google a décidé de rendre ces modes obsolètes, pour des raisons évidentes de sécurité. Donc partez du principe que vous utiliserez toujours le mode MODE_PRIVATE.
Écriture
Pour pouvoir modifier les informations stockées dans les SharedPreferences, il est obligatoire d'utiliser l'API SharedPreferences.Editor.
Tout d'abord, une information stockée est toujours associée à une clé, permettant ainsi de récupérer précisément une valeur souhaitée sans avoir à récupérer l'ensemble des données.
Ensuite, il est obligatoire de préciser le type de donnée stockée, en utilisant la méthode correspondante. Par exemple, pour stocker une chaîne de caractères, il faudra utiliser une méthode spécifique appelée putString(). Et pour stocker un entier, il faudra utiliser la méthode putInt().
Enfin, pour valider la modification, il est nécessaire d'appeler la méthode apply().
Par exemple, pour stocker le prénom de l'utilisateur, le code serait donc le suivant :
SharedPreferences preferences = getSharedPreferences(SHARED_PREF_USER_INFO, MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putString(SHARED_PREF_USER_INFO_NAME, mUser.getFirstName());
editor.apply();
Sachant que vous êtes aussi flemmards que moi, vous préférerez probablement utiliser la version courte :
getSharedPreferences(SHARED_PREF_USER_INFO, MODE_PRIVATE)
.edit()
.putString(SHARED_PREF_USER_INFO_NAME, mUser.getFirstName())
.apply();
Je sais que vous êtes très perspicace et que vous avez noté les deux choses suivantes :
La clé (constante) utilisée pour stocker le prénom de l'utilisateur est SHARED_PREF_USER_INFO_NAME. Vous pouvez la créer comme vous l’avez fait pour le nom du fichier des SharedPreferences.
Le prénom de l'utilisateur est récupéré du modèle.
Lecture
Comme pour l'écriture, la lecture d'une valeur requiert l'appel à une méthode spécifique suivant le type de donnée à récupérer. Par exemple, pour récupérer une chaîne de caractères, il faudra utiliser getString(), alors qu'un entier sera récupéré en utilisant getInt(). Par exemple, pour récupérer le prénom de l'utilisateur, le code suivant sera utilisé :
String firstName = getSharedPreferences(SHARED_PREF_USER_INFO, MODE_PRIVATE).getString(SHARED_PREF_USER_INFO_NAME, null);
Récapitulons en vidéo
Retrouvez ces différentes étapes dans la vidéo ci-dessous :
Mise en application
Grâce à la section précédente, vous devez être en mesure de stocker et récupérer le prénom de l'utilisateur, tout cela dans la MainActivity.
Exercice
Bon, ce n'est pas juste qu'il n'y ait que moi qui bosse. J'ai un petit exercice pour vous. Je vous propose de mettre à jour le code de la MainActivity de la façon suivante :
Lorsque l'activité démarre, vérifiez si une partie a déjà eu lieu (indice : si tel est le cas, un prénom et un score doivent avoir été enregistrés dans les préférences).
Récupérez ces valeurs et mettez à jour le texte d'accueil, en saluant la personne et en lui rappelant son précédent score.
Valorisez également le champ de saisie avec le prénom de la personne, afin d'éviter qu'elle ait à le saisir de nouveau. N'oubliez pas de positionner le curseur à la fin du prénom !
Pensez également à mettre à jour l'affichage lorsqu'une partie vient de se terminer !
Le résultat doit être le suivant :

En résumé
Vous pouvez sauvegarder localement des informations grâce à l'API SharedPreferences.
Pour accéder à l'instance de SharedPreferences, appelez la méthode getSharedPreferences() sur l'activité courante.
Pour modifier les informations stockées dans les SharedPreferences, vous devez utiliser l'API SharedPreferences.Editor.
Voilà, vous savez comment sauvegarder des données simples grâce aux SharedPreferences. Dans le prochain chapitre, nous verrons comment améliorer l'expérience utilisateur.