DataStore o SharedPreferences
Scopra perché DataStore è la scelta moderna.
DataStore o SharedPreferences è una lezione Android Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Android Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Android Academy include 4 lezioni in totale.
Memorizzare piccole impostazioni
Quasi ogni app deve ricordare piccole quantità di dati: un interruttore per la modalità scura, l'ultima scheda utilizzata, un nome utente. Si tratta di preferenze chiave-valore, non di grandi quantità di dati relazionali.
Per anni Android ha usato SharedPreferences per questo scopo. Oggi la soluzione consigliata è DataStore.
Che cos'è SharedPreferences
SharedPreferences è un semplice archivio chiave-valore basato su XML. Si ottiene un editor, si inseriscono i valori e li si salvano.
- Facile da usare
- Integrato nel framework
- API sincrona che può bloccare il thread dell'interfaccia
val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE)
prefs.edit().putBoolean("dark_mode", true).apply()
val dark = prefs.getBoolean("dark_mode", false)I problemi di SharedPreferences
SharedPreferences presenta alcuni limiti concreti:
- Le letture
getX()possono bloccare il thread chiamante (spesso il thread principale) commit()esegue l'I/O su disco in modo sincrono- Non offre un meccanismo integrato per segnalare gli errori
- L'API non è type-safe né reattiva
Entra in gioco DataStore
DataStore è il sostituto moderno, basato sulle coroutine e sui Flow di Kotlin. Esegue tutte le operazioni su disco al di fuori del thread principale ed espone i dati come flusso osservabile.
Esistono due varianti: Preferences DataStore (chiave-valore) e Proto DataStore (oggetti tipizzati).
Asincrono per progettazione
DataStore non blocca mai l'interfaccia. Le letture arrivano tramite un Flow che raccoglie, mentre le scritture sono funzioni suspend da chiamare all'interno di una coroutine.
Questo significa che le letture e le scritture delle impostazioni sono sicure anche sul thread principale, perché il lavoro più oneroso viene eseguito su un dispatcher in background.
val darkMode: Flow<Boolean> = dataStore.data
.map { prefs -> prefs[DARK_MODE_KEY] ?: false }Aggiornamenti reattivi
Poiché DataStore espone un Flow, l'interfaccia si aggiorna automaticamente quando cambia un valore. Con SharedPreferences era necessario registrare un listener dei cambiamenti poco pratico.
In Jetpack Compose è sufficiente applicare collectAsState() al flow e la schermata viene ricomposta a ogni aggiornamento.
Transazionale e coerente
Le scritture di DataStore sono transazionali. Un aggiornamento riesce completamente o fallisce completamente, quindi non leggerà mai un valore scritto solo parzialmente.
Garantisce inoltre la coerenza dei dati tra più letture e scritture all'interno dello stesso processo.
Gestione degli errori
SharedPreferences ignora silenziosamente i problemi di I/O. DataStore li segnala: una lettura può emettere un IOException tramite il flow, che può gestire con catch e dal quale può recuperare.
val settings: Flow<Settings> = dataStore.data
.catch { e ->
if (e is IOException) emit(emptyPreferences())
else throw e
}
.map { /* map to your model */ }Quando DataStore non è la soluzione
DataStore è pensato per dati chiave-valore o tipizzati di dimensioni piccole o medie. Non è un database.
- Grandi quantità di dati, query, relazioni: usi Room
- File, immagini, contenuti multimediali: usi il file system
- Un numero limitato di impostazioni: usi DataStore
Aggiungere la dipendenza
Per usare Preferences DataStore, aggiunga l'artifact al file Gradle del modulo. Esiste un artifact separato per Proto DataStore.
dependencies {
implementation("androidx.datastore:datastore-preferences:1.1.1")
}Eseguire la migrazione da SharedPreferences
Non è necessario riscrivere tutto in una volta. DataStore offre SharedPreferencesMigration, che copia automaticamente i valori esistenti alla prima lettura.
val Context.dataStore by preferencesDataStore(
name = "settings",
produceMigrations = { context ->
listOf(SharedPreferencesMigration(context, "settings"))
}
)Verifica rapida
Verifichi di aver compreso perché DataStore è la scelta preferita.
Riepilogo
Ha appreso perché DataStore è la scelta moderna per le impostazioni chiave-valore:
- SharedPreferences può bloccare il thread principale e non è reattivo
- DataStore usa coroutine e
Flowper un accesso asincrono sicuro - Le scritture sono transazionali e includono una corretta gestione degli errori
- Esistono due varianti: Preferences e Proto
Nel prossimo passaggio userà in pratica il delegate preferencesDataStore.
Impara Kotlin con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 36
- Lezioni
- 152
Domande Frequenti
La lezione «DataStore o SharedPreferences» è gratuita?
Sì — il testo completo di «DataStore o SharedPreferences» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Android Academy, passa a CoddyKit PRO. Il corso Android Academy include 4 lezioni in totale.
Cosa imparerò in «DataStore o SharedPreferences»?
Scopra perché DataStore è la scelta moderna. Eserciti Android Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Android Academy?
Non è richiesta alcuna esperienza precedente. Android Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «DataStore o SharedPreferences»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Android Academy?
Sì. Ogni lezione Android Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- DataStore o SharedPreferences
- Preferences DataStore
- Leggere e scrivere le impostazioni
- Proto DataStore