Proto DataStore
Stockez des données structurées et typées.
Proto DataStore est une leçon Android Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Android Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Android Academy comprend 4 leçons au total.
Proto DataStore
Proto DataStore stocke des objets structurés fortement typés plutôt que des paires clé-valeur non structurées. Vous définissez un schéma et DataStore stocke un objet typé par fichier.
Il est idéal lorsque vos paramètres forment un modèle cohérent.
Pourquoi utiliser des données typées
Preferences DataStore n’est pas typé : une faute de frappe dans une clé ou la lecture du mauvais type n’échoue qu’à l’exécution. Proto DataStore vous offre une sûreté de type à la compilation pour l’ensemble de l’objet de paramètres.
- Aucune clé textuelle susceptible de contenir une faute de frappe
- Valeurs par défaut définies dans le schéma
- Champs faciles à remanier
Choix du format de sérialisation
L’approche classique utilise les Protocol Buffers (proto) pour définir le schéma. Vous pouvez également sérialiser avec kotlinx.serialization ou avec un format personnalisé. Le schéma décrit les champs et les types.
Définition d’un schéma Proto
Vous écrivez un fichier .proto décrivant le message de vos paramètres. Le compilateur protobuf génère une classe Kotlin/Java à partir de celui-ci.
syntax = "proto3";
option java_package = "com.example.app";
option java_multiple_files = true;
message UserSettings {
bool dark_mode = 1;
int32 font_size = 2;
string username = 3;
}Implémentation d’un sérialiseur
DataStore a besoin d’un Serializer qui sait lire et écrire votre type dans un flux, ainsi que d’un defaultValue utilisé lorsque le fichier est vide.
object UserSettingsSerializer : Serializer<UserSettings> {
override val defaultValue: UserSettings = UserSettings.getDefaultInstance()
override suspend fun readFrom(input: InputStream): UserSettings =
UserSettings.parseFrom(input)
override suspend fun writeTo(t: UserSettings, output: OutputStream) =
t.writeTo(output)
}Création de Proto DataStore
Utilisez le délégué dataStore (et non preferencesDataStore), en lui transmettant le nom du fichier et votre sérialiseur.
val Context.settingsStore: DataStore<UserSettings> by dataStore(
fileName = "user_settings.pb",
serializer = UserSettingsSerializer
)Lecture de données typées
Les lectures passent par settingsStore.data, mais le type du flux est désormais celui de votre modèle. Aucune clé ni conversion de type : accédez simplement aux champs directement.
val darkMode: Flow<Boolean> = context.settingsStore.data
.map { settings -> settings.darkMode }Écriture avec updateData
Proto DataStore remplace edit par la fonction suspendue updateData. Vous recevez l’objet actuel et en renvoyez un nouveau. Avec protobuf, vous utilisez le générateur créé par le compilateur.
suspend fun setDarkMode(enabled: Boolean) {
context.settingsStore.updateData { current ->
current.toBuilder()
.setDarkMode(enabled)
.build()
}
}Mises à jour immuables
Remarquez que vous ne modifiez jamais l’objet existant : vous en construisez et en renvoyez un nouveau. Cette immutabilité rend les mises à jour transactionnelles et cohérentes pour tous les observateurs.
Gestion de la corruption
Si le fichier stocké devient illisible, DataStore déclenche une CorruptionException. Vous pouvez fournir un corruptionHandler qui renvoie une valeur par défaut sûre au lieu de provoquer un plantage.
val Context.settingsStore by dataStore(
fileName = "user_settings.pb",
serializer = UserSettingsSerializer,
corruptionHandler = ReplaceFileCorruptionHandler {
UserSettings.getDefaultInstance()
}
)Preferences ou Proto
Faites votre choix selon vos besoins :
- Preferences : quelques indicateurs indépendants, configuration rapide, aucun schéma
- Proto : modèle de paramètres structuré, sûreté de type, valeurs par défaut définies
Les deux reposent sur les mêmes fondations asynchrones, transactionnelles et basées sur Flow.
Vérification rapide
Vérifiez votre compréhension de Proto DataStore.
Récapitulatif
Vous avez appris à stocker des données typées avec Proto DataStore :
- Définir un schéma, souvent avec Protocol Buffers
- Implémenter un
Serializeravec undefaultValue - Créer le magasin au moyen du délégué
dataStore - Lire directement les champs et écrire avec
updateData - Gérer la corruption avec un gestionnaire qui renvoie une valeur par défaut
Vous avez terminé le cours sur DataStore.
Questions Fréquemment Posées
La leçon « Proto DataStore » est-elle gratuite ?
Oui — le texte complet de « Proto DataStore » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Android Academy, passe à CoddyKit PRO. Le cours Android Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Proto DataStore » ?
Stockez des données structurées et typées. Tu pratiques Android Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Android Academy ?
Aucune expérience préalable n'est requise. Android Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « Proto DataStore » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Android Academy ?
Oui. Chaque leçon Android Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.