Stockage de données avec Jetpack DataStore
Comment stocker des données clé-valeur avec la nouvelle librairie Jetpack DataStore
Dans ce mini billet, nous allons voir comment utiliser la dernière librairie Jetpack DataStore pour stocker localement des données sur Android et comment migrer nos données de SharedPreferences vers DataStore.
Jusqu’à il y a quelques semaines, l’API mise à disposition par Android pour sauvegarder des informations locales était SharedPreferences. Cette interface récupère les données que vous lui passez et les stocke dans un fichier XML. Néanmoins, elle présente les lacunes suivantes:
- Pour lire les données écrites sur le fichier XML, L’API doit évidemment effectuer une opération entrée-sortie 😶
- la méthode get est synchrone, elle doit attendre que le fichier XML soit chargé en mémoire avant de le lire ce qui pourrait bloquer l’UI thread et potentiellement mener l’application à un crash de type ANR (Application Not Responding). 😣
- la méthode apply() (asynchrone) appelée pour réécrire les informations dans le fichier n’offre pas la possibilité de savoir si l’opération a réussi ou échoué. La méthode commit() quant a elle, donne la possibilité de connaître l’état de l’opération… mais elle est synchrone. 😔
- SharedPreferences ne garantit pas la sûreté du typage 😟
DataStore à la rescousse !
En Septembre dernier, Google a annoncé DataStore avec comme but de remplacer SharedPreferences comme solution de stockage de données clé-valeur en locale. C’est une majeure avancée comparé au bon vieil ami SharedPreferences.
Avantages :
- Écrite en kotlin, basée sur les coroutines et Flow 🔥
- DataStore utilise Dispatchers.IO pour les opérations E/S, donc plus de crainte d’affronter un crash ANR 😛
- Pas de runtime Exceptions 😍
- Fournit un moyen de migrer ses données de SharedPreferences 💃
- Sûreté du typage (Protocol Buffers) 👍
Config 👷
Pour utiliser DataStore Preferences, commencez par ajouter la dépendance suivante:
Votre store
A l’aide la fonction d’extension createDataStore(), créez une instance de SingleProcessDataStore, mettez en paramètre le nom du fichier sur lequel seront enregistrées vos données.
Cette opération va créer un fichier “datastore/$nom.preferences_pb” dans la mémoire de stockage du téléphone.
Stocker une donnée préférence sur DataStore
Dans ce exemple, vous allez stocker une chaîne de caractère qui contient le nom d’un utilisateur. Ainsi lorsqu’il relancera l’application il pourra récupérer son nom enregistré dans les préférences.
Apres votre objet dataStore, vous aurez besoin d’une clé représentant la valeur que vous souhaitez enregistrer. La clé se présente sous la forme:
Votre clé sera donc:
puis avec ces deux lignes, vous enregistrez le nom de l’utilisateur dans les préférences.
et pour le récupérer, rien de plus simple:
comme vous pouvez le voir ce bout de code récupère un Flow<String> (flux) de String sur lequel est effectuée une opération.
Et bingo 🎊
Vous pouvez encore “kotlinifier” davantage ce code en ajoutant ces deux fonctions d’extensions:
setValue() pour stocker une valeur
et getValueFlow() pour la récupérer 👌
A noter ici que getValueFlow vous permet de faire un catch et gérer l’erreur en cas d’exception. Sympa non?
Migrer vos SharedPreferences vers DataStore
Vous vous demandez surement que faire de vos anciennes données préférences si Google remplace SharedPreferences par DataStore. Et bien tout a été prévu et la nouvelle API DataStore vous offre la possibilité de migrer vos anciennes données vers DataStore.
Supposons que votre fichier shared preferences porte le nom “users_shared_prefs”. Pendant l’instanciation de votre SingleProcessDataStore vous ajoutez l’argument migration qui prend une listOf(SharedPreferencesMigration).
vous aurez donc:
Et puis.. c’est tout ! toutes vos données préférences seront migres vers DataStore 🔥🔥
N’hésitez pas à laisser quelques applaudissements 👏, à partager et à suivre AndroidMood pour ne pas rater nos prochains articles.
Merci et bonne lecture ! 💯