Usando il database della camera | Android Jetpack

Ashish Rawat

Follow

Feb 23, 2019 – 6 min read

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.
Room è fantastico

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

  1. 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.gradleper 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.

Lascia un commento