SharedPreferences – Sauvegarder des objets complexes

Je vous ai précédemment montré comment sauvegarder des données dans les SharedPréférences, ce qui était plutôt simple. Un problème persiste, cet espace de stockage ne peut gérer que des types primitifs : int, string, bool, float, etc. Comment l’utiliser pour sauvegarder nos objets, par exemple l’utilisateur actuellement connecté ou une liste d’articles favoris ?

L’astuce : Sérialisation

Si vous avez l’habitude de travailler avec des webservices sous Android, vous devez savoir qu’il est possible de transformer un objet Java en String et inversement. Les webservices nous renvoient souvent du JSON ou du XML, représentant nos données. Pourquoi ne pas réutiliser ce principe pour notre sauvegarde ?

Première étape, il nous faut un sérialiseur, je vais utiliser GSON, une libraire de Google permettant de sérialiser/déserialiser un objet en JSON.

Ajoutez à votre fichier build.gradle

'com.google.code.gson:gson:1.7.2'

Maintenant, pour transformer votre objet en JSON

Gson gson = new Gson();

User user = ...; //on veut sauvegarder cet objet
String json = gson.toJson(user);

Puis, pour créer notre objet à partir d’un JSON

Gson gson = new Gson();

String json = ...; //json représentant notre objet User

User user = gson.fromJson(json,User.class);

Let’s go !

Combinons cela avec un SharedPreferences

Sauvegarder un objet

SharedPreferences sharedPreferences = context.getSharedPreferences("PREFS", Context.MODE_PRIVATE);
Gson gson = new Gson();

User user = ...; //on veut sauvegarder cet objet

sharedPreferences.edit()
     .putString("user",gson.toJson(user))
     .apply();

Charger un objet

SharedPreferences sharedPreferences = context.getSharedPreferences("PREFS", Context.MODE_PRIVATE);
Gson gson = new Gson();

String json = sharedPreferences.getString("user",null);

User user = null;
if(json != null)
    user = gson.fromJson(json,User.class);

Plutôt simple non ? 🙂

Charger une liste

Pour charger une liste, il faut modifier un peu notre code, puisque le List.class ne sera pas accepté dans gson.fromJson

Il suffit de le remplacer par

gson.fromJson(json,new TypeToken<List<User>>() {}.getType()

Pour que la liste soit bien prise en compte.

Sauvegarder une liste

SharedPreferences sharedPreferences = context.getSharedPreferences("PREFS", Context.MODE_PRIVATE);
Gson gson = new Gson();

List<User> users = ...; //on veut sauvegarder ces objets

sharedPreferences.edit()
     .putString("users",gson.toJson(users))
     .apply();

Charger une liste

SharedPreferences sharedPreferences = context.getSharedPreferences("PREFS", Context.MODE_PRIVATE);
Gson gson = new Gson();

String json = sharedPreferences.getString("users",null);

List<User> users = null;
if(json != null)
    user = gson.fromJson(json,new TypeToken<List<User>>() {}.getType());

Conclusion

Avec ces quelques lignes, vous êtes maintenant en mesure d’utiliser les SharedPreferences pour stocker simplement et durablement des objets complexes dans votre application.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *