
Per quelli di voi che non sanno cos’è Android Jetpack allora
Android Jetpack è una collezione di componenti software Android per rendere più facile lo sviluppo di grandi applicazioni Android.
Ti aiuteranno a
- Seguire le migliori pratiche
- Libera dalla scrittura di codice boilerplate.
- Semplifica i compiti complessi, così puoi concentrarti sul codice che ti interessa.
Ecco il video da Android Developers Channel:
Ora parliamo di Room
Room è una libreria di persistenza, parte di Android Jetpack.
Ecco il video da Android Developers Channel:
Room fornisce un livello di astrazione sopra SQLite per permettere un accesso fluido al database pur sfruttando tutta la potenza di SQLite.
Room è ora considerato un approccio migliore di SQLiteDatabase per la persistenza dei dati. Rende più facile lavorare con gli oggetti SQLiteDatabase nella tua app, diminuendo la quantità di codice boilerplate e verificando le query SQL in fase di compilazione.
- Verifica in fase di compilazione delle query SQL. ogni @Query e @Entity viene controllata in fase di compilazione, questo preserva la tua app da problemi di crash in fase di esecuzione e non solo controlla la sola sintassi, ma anche le tabelle mancanti.
- Codice boilerplate
- Facilmente integrabile con altri componenti di Architecture (come LiveData)
I problemi maggiori nell’uso di SQLite sono
- Non c’è una verifica in fase di compilazione delle query SQL grezze. Per esempio, se si scrive una query SQL con un nome di colonna sbagliato che non esiste nel database reale, allora darà un’eccezione durante l’esecuzione e non è possibile catturare questo problema durante la compilazione.
- Quando lo schema cambia, è necessario aggiornare manualmente le query SQL interessate. Questo processo può richiedere molto tempo ed essere soggetto ad errori.
- È necessario utilizzare molto codice boilerplate per convertire le query SQL e gli oggetti dati Java (POJO).
Room vs SQLite
Room è un ORM, Object Relational Mapping library. In altre parole, Room mapperà i nostri oggetti del database in oggetti Java. Room fornisce un livello di astrazione sopra SQLite per permettere un accesso fluente al database mentre sfrutta tutta la potenza di SQLite.
Differenza tra SQLite e la libreria di persistenza Room:-
- Nel caso di SQLite, non c’è una verifica di compilazione delle query SQLite grezze. Ma in Room, c’è la validazione SQL al momento della compilazione.
- È necessario utilizzare un sacco di codice boilerplate per convertire tra le query SQL e gli oggetti dati Java. Ma Room mappa i nostri oggetti di database in oggetti Java senza codice boilerplate.
- Quando il vostro schema cambia, dovete aggiornare manualmente le query SQL interessate. Room risolve questo problema.
- Room è costruito per lavorare con LiveData e RxJava per l’osservazione dei dati, mentre SQLite non lo fa.
Componenti di Room DB

Room ha tre componenti principali di Room DB :
- Entity
- Dao
- Database
Entity
Rappresenta una tabella all’interno del database. Room crea una tabella per ogni classe che ha @Entity
annotation, i campi della classe corrispondono alle colonne della tabella. Pertanto, le classi entità tendono ad essere piccole classi modello che non contengono alcuna logica.
Annotazioni entità
Prima di iniziare a modellare le nostre entità, dobbiamo conoscere alcune annotazioni utili e i loro attributi.
@Entity – ogni classe del modello con questa annotazione avrà una tabella di mappatura nel DB
- foreignKeys – nomi delle chiavi esterne
- indices – lista di indicazioni sulla tabella
- primaryKeys – nomi delle chiavi primarie delle entità
- tableName
@PrimaryKey – come indica il suo nome, questa annotazione indica la chiave primaria dell’entità. autoGenerate – se impostato a true, allora SQLite genererà un id unico per la colonna
@PrimaryKey(autoGenerate = true)
@ColumnInfo – permette di specificare informazioni personalizzate sulla colonna
@ColumnInfo(name = "column_name")
@Ignore – il campo non sarà persistito da Room
@Embeded – i campi annidati possono essere referenziati direttamente nelle query SQL.
Dao
IDAO sono responsabili della definizione dei metodi di accesso al database. Nell’SQLite iniziale, usiamo gli oggetti Cursor
. Con Room, non abbiamo bisogno di tutto il codice relativo a Cursor
e possiamo semplicemente definire le nostre query usando le annotazioni nella classe Dao
.
Database
Contiene il titolare del database e serve come punto di accesso principale per la connessione sottostante ai dati relazionali persistenti della tua app.
Per creare un database dobbiamo definire una classe astratta che estende RoomDatabase
. Questa classe è annotata con @Database
, elenca le entità contenute nel database e le DAO che vi accedono.
La classe annotata con @Database
dovrebbe soddisfare le seguenti condizioni:
- essere una classe astratta che estende
RoomDatabase
. - Includere la lista delle entità associate al database all’interno dell’annotazione.
- Contenere un metodo astratto che ha 0 argomenti e restituisce la classe che è annotata con
@Dao
.
In fase di esecuzione, è possibile acquisire un’istanza di Database
chiamando Room.databaseBuilder()
oRoom.inMemoryDatabaseBuilder()
.
Passo 1: Aggiungere le dipendenze di Gradle
- Per aggiungerlo al tuo progetto, apri il file
build.gradle
a livello di progetto e aggiungi la linea evidenziata come mostrato sotto:

2. Apri il file build.gradle
per la tua applicazione o modulo e aggiungi le dipendenze:

Passo 2: creare una classe modello
Room crea una tabella per ogni classe annotata con @Entity
; i campi della classe corrispondono alle colonne della tabella. Pertanto, le classi entità tendono ad essere piccole classi modello che non contengono alcuna logica. La nostra classe Person
rappresenta il modello dei dati nel database. Quindi aggiorniamola per dire a Room che dovrebbe creare una tabella basata su questa classe:
- Annota la classe con
@Entity
e usa la proprietàtableName
per impostare il nome della tabella. - Imposta la chiave primaria aggiungendo l’annotazione
@PrimaryKey
ai campi corretti – nel nostro caso, questo è l’ID dell’utente. - Imposta il nome delle colonne per i campi della classe usando l’annotazione
@ColumnInfo(name = "column_name")
. Sentitevi liberi di saltare questo passo se i vostri campi hanno già il nome corretto della colonna. - Se sono adatti più costruttori, aggiungete l’annotazione
@Ignore
per dire a Room quali dovrebbero essere usati e quali no.

Step 3: Creare oggetti di accesso ai dati (DAO)
I DAO sono responsabili della definizione dei metodi di accesso al database.
Per creare un DAO dobbiamo creare un’interfaccia e annotarla con @Dao .

Step 4 – Creare il database
Per creare un database dobbiamo definire una classe astratta che estende RoomDatabase
. Questa classe è annotata con @Database
, elenca le entità contenute nel database e i DAO che vi accedono.

Passo 4: Gestire i dati
Per gestire i dati, per prima cosa, dobbiamo creare un’istanza del database.
poi possiamo inserire, cancellare e aggiornare il database.
Assicuratevi che tutte le operazioni vengano eseguite su un thread diverso. Nel mio caso uso Executers (vedi qui)
Query:

Insert:

Cancellare:

Aggiornare:

Esecuzione con Executer

Ho anche linkato un repo se avete bisogno di vedere l’esempio di Room Database.