Archiviazione dati nello sviluppo mobile: cos'è, metodi e come funziona

Autore: IT Sectr Pubblicato: 2026-03-08 Tempo di lettura: 9 min

L'archiviazione dei dati è uno dei compiti principali di un'applicazione mobile, che influisce su prestazioni, sicurezza ed esperienza utente. In questo articolo tratteremo SQLite, Room, Core Data, Realm, Firebase Firestore, SharedPreferences, DataStore, Keystore e Keychain, oltre ai formati di serializzazione (JSON, Protobuf) e alle librerie (Gson, Moshi, kotlinx.serialization). Questa guida aiuterà gli sviluppatori principianti a scegliere la soluzione di archiviazione dati corretta. Per maggiori informazioni, consulta la guida ufficiale Android sull'archiviazione dati.

Punti chiave

  • Room (Android) e Core Data (iOS) sono gli ORM ufficiali per lavorare con database relazionali su ciascuna piattaforma
  • SharedPreferences (Android) viene sostituito da DataStore — un archivio chiave-valore asincrono e type-safe
  • Per l'archiviazione sicura dei token si utilizzano Keystore (Android) e Keychain (iOS) con protezione hardware
  • Firebase Firestore è un database NoSQL con sincronizzazione in tempo reale e modalità offline
  • Serializzazione — conversione di oggetti in JSON/Protobuf tramite Gson, Moshi, kotlinx.serialization

Database locali: SQLite, Room, Core Data, Realm

Per archiviare dati strutturati con relazioni tra entità si utilizzano database relazionali.

SQLite

SQLite è un database relazionale incorporato che funziona su qualsiasi piattaforma mobile. Non richiede un server separato e i dati sono memorizzati in un singolo file. SQLite è la base per Room (Android) e opzionalmente per Core Data (iOS). Librerie: android.database.sqlite (Android), FMDB/Core Data (iOS), sqflite (Flutter).

Room (Android)

Room è la libreria ufficiale di Android Architecture Components per lavorare con SQLite. Fornisce un livello ORM: Entity (tabella), DAO (query), Database (punto di ingresso). Room verifica le query SQL in fase di compilazione, supporta coroutine e Flow e migra automaticamente lo schema.

kotlin
@Entity
data class User(
    @PrimaryKey val id: Int,
    val name: String,
    val email: String
)

@Dao
interface UserDao {
    @Query("SELECT * FROM user WHERE id = :id")
    suspend fun getUser(id: Int): User?
}

Core Data (iOS)

Core Data è il framework di Apple per gestire un grafo di oggetti. Non è un database puro — è un livello di persistenza sopra SQLite, XML o archiviazione binaria. Core Data gestisce oggetti (NSManagedObject), relazioni, versionamento dello schema, annulla/ripeti e multithreading tramite NSManagedObjectContext.

Realm

Realm è un'alternativa a SQLite, progettata come database mobile ad alte prestazioni. Realm è più veloce di SQLite in lettura e scrittura, supporta notifiche reattive (Live Objects), crittografia in tempo reale e multipiattaforma (Android, iOS, Flutter, React Native). Svantaggi: dimensione APK/IPA maggiore e consumo di memoria più elevato.

Archivio chiave-valore e impostazioni

Per archiviare piccole quantità di dati (impostazioni, token, cache) si utilizzano semplici archivi chiave-valore.

SharedPreferences (Android)

SharedPreferences è un archivio chiave-valore legacy in Android. Svantaggi: accesso sincrono (blocca l'interfaccia durante la lettura), mancanza di tipizzazione, rischio ANR durante il caricamento di file grandi. NON consigliato per nuovi progetti.

DataStore (Jetpack Android)

DataStore è il moderno sostituto di SharedPreferences di Google. Funziona in modo asincrono tramite Kotlin Coroutines e Flow, supporta Preferences DataStore (chiave-valore) e Proto DataStore (dati tipizzati tramite Protobuf). DataStore è sicuro per il thread dell'interfaccia e supporta le transazioni.

NSUserDefaults (iOS)

UserDefaults è l'archivio standard per piccole impostazioni in iOS. Supporta tipi primitivi, stringhe, date, Data. UserDefaults è sincrono, quindi non adatto per grandi volumi di dati. La registrazione dei valori tramite register(defaults:) imposta i valori predefiniti.

Database cloud: Firebase Firestore e Realtime DB

Per l'archiviazione dati in applicazioni che richiedono sincronizzazione tra dispositivi, si utilizzano i database cloud Firebase.

Cloud Firestore

Firebase Firestore è un database documentale NoSQL con sottoscrizioni in tempo reale, scalabilità automatica, query potenti e modalità offline integrata. I dati sono organizzati in raccolte e documenti (strutture simili a JSON). Firestore supporta transazioni e operazioni batch. Ideale per chat, feed e app social.

Firebase Realtime Database

Firebase Realtime Database è un database NoSQL più vecchio di Firebase che memorizza i dati come un singolo albero JSON. Più semplice di Firestore ma meno flessibile in query e scalabilità. Raccomandato per applicazioni in tempo reale semplici (stato online, chat semplici).

Caratteristica Cloud Firestore Firebase Realtime DB
Modello datiRaccolte → DocumentiAlbero JSON
QueryComplesse (filtraggio, ordinamento, limiti)Semplici (per chiave)
ScalabilitàAutomaticaSharding manuale
Modalità offlineSì (cache persistente)
PrezzoPer operazioni di lettura/scritturaPer traffico + archiviazione

Archiviazione sicura: Keystore, Keychain e EncryptedSharedPreferences

L'archiviazione di token, password e chiavi di crittografia richiede archivi protetti speciali.

Android Keystore

Android Keystore è un archivio di sistema per chiavi crittografiche. Le chiavi sono memorizzate in un ambiente hardware (TEE — Trusted Execution Environment), inaccessibile alle app e al sistema operativo. Supporta generazione di chiavi, crittografia e firma. Android 9+ include StrongBox Keymaster (chip dedicato).

iOS Keychain

Keychain Services è un archivio sicuro iOS per password, chiavi e certificati. I dati sono crittografati utilizzando Secure Enclave hardware. Keychain supporta livelli di accessibilità: Always, WhenUnlocked, WhenUnlockedThisDeviceOnly, AfterFirstUnlock.

EncryptedSharedPreferences (Android)

EncryptedSharedPreferences è un wrapper su SharedPreferences con crittografia di chiavi e valori tramite AES256-GCM e HKDF. Implementato nella libreria AndroidX Security. Raccomandato per memorizzare token e impostazioni sensibili.

In IT Sectr utilizziamo Android Keystore + EncryptedSharedPreferences per memorizzare token di aggiornamento e chiavi biometriche. Su iOS utilizziamo Keychain con livello kSecAttrAccessibleWhenUnlockedThisDeviceOnly per la massima sicurezza.

Archiviazione file: Internal, External, Cache Directory

Per l'archiviazione di file (immagini, video, documenti), le piattaforme mobili forniscono diversi tipi di archiviazione.

Android Storage

Android distingue tra Internal Storage (/data/data/package/ — archiviazione privata) e External Storage (scheda SD o partizione emulata). Cache Directory è archiviazione temporanea che il sistema può cancellare. Scoped Storage (Android 10+) limita l'accesso a External Storage — le app vedono solo i propri file o file tramite MediaStore/SAF.

iOS Storage

iOS fornisce Documents Directory (backup iCloud, dati persistenti), Library/Caches (file temporanei, non sottoposti a backup) e Tmp Directory (temporanei, cancellabili). Utilizza NSFileManager per lavorare con il file system. iOS 11+ supporta File Provider per file cloud.

Serializzazione dati: JSON, Protobuf e librerie

La serializzazione converte gli oggetti in un formato per la trasmissione o l'archiviazione. La deserializzazione è il processo inverso.

Formati

JSON (JavaScript Object Notation) è il formato più popolare: leggibile, flessibile, supportato da tutte le piattaforme. XML è più rigoroso, utilizzato in sistemi legacy. Protobuf (Protocol Buffers) è un formato binario di Google: 3-10 volte più compatto di JSON, analisi più veloce, con schema rigoroso. Utilizzato per sistemi ad alto carico e microservizi.

Librerie Android

  • Gson (Google) — semplice, flessibile, ma lento. Funziona automaticamente con oggetti Java/Kotlin
  • Moshi (Square) — più veloce di Gson, miglior supporto Kotlin (proprietà non nulle, valori predefiniti, classi sealed)
  • kotlinx.serialization — serializzazione Kotlin nativa di JetBrains, funziona in fase di compilazione, supporta JSON, Protobuf, CBOR

Librerie iOS

JSONSerialization è l'API integrata per lavorare con JSON. Codable (Encodable/Decodable) è un protocollo Swift moderno per la serializzazione automatica in JSON, Property List e altri formati.

swift
struct User: Codable {
    let id: Int
    let name: String
    let email: String
}
let user = User(id: 1, name: "Alice", email: "alice@example.com")
let encoder = JSONEncoder()
let jsonData = try encoder.encode(user)

Soluzioni multipiattaforma: Hive, ObjectBox, Drift

Per Flutter e React Native esistono librerie di archiviazione efficienti dedicate.

Hive (Flutter)

Hive è un archivio chiave-valore leggero e veloce per Flutter. Non richiede codice nativo (Dart puro), supporta la tipizzazione tramite TypeAdapter e funziona in isolate. Ideale per cache, impostazioni e piccoli volumi di dati.

ObjectBox

ObjectBox è un database incorporato ad alte prestazioni per Flutter, Android e iOS. È 10 volte più veloce di SQLite, utilizza una struttura a file piatto per un overhead minimo. Supporta relazioni, query e sottoscrizioni reattive (ObjectBox Dart).

Drift (ex Moor)

Drift è una libreria SQLite reattiva per Flutter e Dart. Fornisce query type-safe, migrazioni, funzioni DAO e supporto Stream (aggiornamenti reattivi). Drift è la scelta principale per progetti Flutter che richiedono SQLite.

Domande frequenti

Cosa è meglio per l'archiviazione locale dei dati: Room o Core Data?

La scelta dipende dalla piattaforma: Room (Android) è la libreria ufficiale basata su SQLite con verifica delle query in fase di compilazione. Core Data (iOS) è il framework Apple con grafo di oggetti. Per progetti multipiattaforma, Realm o SQLite tramite ORM sono adatti.

Qual è la differenza tra SharedPreferences e DataStore?

SharedPreferences è una vecchia implementazione con accesso sincrono e rischio ANR. DataStore (Jetpack) è un sostituto moderno basato su Kotlin Coroutines e Flow, che supporta asincronia, tipizzazione e protezione dagli errori.

Come archiviare in modo sicuro token e password in un'app mobile?

Android: EncryptedSharedPreferences o Android Keystore. iOS: Keychain Services con accessibilità WhenUnlockedThisDeviceOnly. Per dati critici, utilizzare Secure Enclave (iOS) e Keystore hardware (Android) con biometria.

Cos'è Firebase Firestore e quando usarlo?

Cloud Firestore è un database NoSQL di Firebase con sincronizzazione in tempo reale, modalità offline e scalabilità automatica. Adatto per chat, feed di notizie e progetti che necessitano di sincronizzazione tra dispositivi.

Quali ORM esistono per Flutter e React Native?

Flutter: Hive (chiave-valore veloce), Floor (ORM SQLite), Drift (Moor, SQLite reattivo), ObjectBox (DB incorporato ad alte prestazioni). React Native: Realm, WatermelonDB (caricamento lento) e AsyncStorage (analogo a SharedPreferences).

Riepilogo

  • Room (Android) e Core Data (iOS) sono le soluzioni ufficiali per database relazionali su ciascuna piattaforma
  • DataStore sostituisce SharedPreferences per l'archiviazione asincrona delle impostazioni
  • Keystore / Keychain sono obbligatori per l'archiviazione sicura di token e chiavi
  • Firebase Firestore è la scelta migliore per la sincronizzazione in tempo reale tra dispositivi
  • Kotlinx.serialization (Android) e Codable (iOS) sono approcci moderni alla serializzazione
  • Per Flutter: Drift (SQLite), Hive (chiave-valore), ObjectBox (alte prestazioni)
  • Realm è un'alternativa multipiattaforma a SQLite con notifiche reattive

Svilupperemo un'applicazione mobile chiavi in mano

IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.

Discuti il progetto