DataStore pour Kotlin : guide complet avec exemples pratiques
1. Qu'est-ce que DataStore et pourquoi l'utiliser ?
DataStore est une bibliothèque développée par Google pour stocker de petites quantités de données dans les applications Kotlin (et Android). Elle remplace l'ancienne SharedPreferences en offrant une méthode plus sûre, asynchrone et typée pour gérer les données. DataStore s'appuie sur Kotlin Coroutines et Flow, ce qui en fait le choix idéal pour les applications modernes utilisant la programmation réactive.
Pourquoi utiliser DataStore ? Le principal problème de SharedPreferences est la lecture synchrone depuis le disque, qui peut bloquer le thread UI, ainsi que l'absence de support des types de données (tout est stocké sous forme de Set<String>). DataStore résout ces problèmes : toutes les opérations de lecture et d'écriture sont asynchrones, et les données sont stockées dans des objets typés (via Protocol Buffers ou Preferences). De plus, DataStore gère automatiquement les erreurs de sérialisation et fournit une API propre pour manipuler les données.
La bibliothèque existe en deux versions : Preferences DataStore (pour stocker des paires clé-valeur simples, comme avec SharedPreferences) et Proto DataStore (pour stocker des objets typés via Protocol Buffers). Dans cet article, nous nous concentrerons sur Preferences DataStore, la version la plus simple et la plus couramment utilisée.
2. Installation
DataStore est distribué via Maven Central. Pour l'ajouter à votre projet Kotlin/Android, ajoutez la dépendance dans le fichier build.gradle.kts (module app) :
dependencies {
// Preferences DataStore
implementation("androidx.datastore:datastore-preferences:1.1.1")
// Si vous utilisez Proto DataStore
// implementation("androidx.datastore:datastore-core:1.1.1")
// Pour le support Coroutines (généralement déjà présent)
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.0")
}
Si vous utilisez Gradle avec Groovy (build.gradle), la ligne sera :
implementation 'androidx.datastore:datastore-preferences:1.1.1'
Après synchronisation de Gradle, la bibliothèque est prête à être utilisée.
3. Démarrage rapide — exemple minimal fonctionnel
Créons un DataStore simple pour stocker le nom d'utilisateur et un compteur.
import android.content.Context
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.intPreferencesKey
import androidx.datastore.preferences.core.stringPreferencesKey
import androidx.datastore.preferences.preferencesDataStore
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
// Extension pour Context, créant le DataStore
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "user_settings")
// Clés pour les données
val USER_NAME_KEY = stringPreferencesKey("user_name")
val COUNTER_KEY = intPreferencesKey("counter")
class UserPreferences(private val context: Context) {
// Lecture du nom d'utilisateur sous forme de Flow
val userName: Flow<String?> = context.dataStore.data.map { preferences ->
preferences[USER_NAME_KEY]
}
// Lecture du compteur sous forme de Flow
val counter: Flow<Int> = context.dataStore.data.map { preferences ->
preferences[COUNTER_KEY] ?: 0
}
// Sauvegarde du nom d'utilisateur
suspend fun saveUserName(name: String) {
context.dataStore.edit { preferences ->
preferences[USER_NAME_KEY] = name
}
}
// Incrémentation du compteur
suspend fun incrementCounter() {
context.dataStore.edit { preferences ->
val currentCounter = preferences[COUNTER_KEY] ?: 0
preferences[COUNTER_KEY] = currentCounter + 1
}
} Aussi dans la bibliothèque
Envoi de SMS en Java : Aperçu et exemples d'utilisation des bibliothèques API (Twilio, Nexmo)
Mise en cache en TypeScript : Redis, Memcached et solutions en mémoire
Envoi d'email en Java : bibliothèque Jakarta Mail (JavaMail)