Room és una biblioteca de persistència de dades que proporciona una capa d'abstracció sobre SQLite per permetre un accés més robust a la base de dades. Room simplifica la gestió de bases de dades en aplicacions Android, oferint una API més fàcil d'utilitzar i integrant-se amb LiveData i RxJava per a operacions asíncrones.

Objectius del Tema

  • Comprendre què és Room i per què s'utilitza.
  • Aprendre a configurar Room en un projecte Android.
  • Crear entitats, DAOs (Data Access Objects) i la base de dades.
  • Realitzar operacions bàsiques de CRUD (Create, Read, Update, Delete) amb Room.

  1. Configuració de Room

Afegir les Dependències

Per començar a utilitzar Room, necessitem afegir les dependències necessàries al fitxer build.gradle del mòdul de l'aplicació.

dependencies {
    implementation "androidx.room:room-runtime:2.4.2"
    annotationProcessor "androidx.room:room-compiler:2.4.2"
    // Opcional: Room amb RxJava2 o RxJava3
    implementation "androidx.room:room-rxjava2:2.4.2"
    implementation "androidx.room:room-rxjava3:2.4.2"
    // Opcional: Room amb Kotlin Coroutines
    implementation "androidx.room:room-ktx:2.4.2"
}

Habilitar l'Anotació de Processament

Per utilitzar les anotacions de Room, hem d'habilitar l'anotació de processament. Afegiu el següent al fitxer build.gradle del projecte:

android {
    ...
    defaultConfig {
        ...
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
            }
        }
    }
}

  1. Creació d'Entitats

Una entitat representa una taula a la base de dades. Cada camp de l'entitat representa una columna a la taula.

import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "users")
data class User(
    @PrimaryKey(autoGenerate = true) val id: Int,
    val name: String,
    val age: Int
)

  1. Creació de DAOs

Els DAOs (Data Access Objects) són interfícies que defineixen les operacions de la base de dades. Utilitzem anotacions per definir les operacions de CRUD.

import androidx.room.Dao
import androidx.room.Insert
import androidx.room.Query

@Dao
interface UserDao {
    @Insert
    suspend fun insert(user: User)

    @Query("SELECT * FROM users")
    suspend fun getAllUsers(): List<User>

    @Query("DELETE FROM users")
    suspend fun deleteAllUsers()
}

  1. Creació de la Base de Dades

La base de dades és una classe abstracta que extén RoomDatabase i defineix els DAOs.

import androidx.room.Database
import androidx.room.RoomDatabase

@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

  1. Inicialització de la Base de Dades

Inicialitzem la base de dades utilitzant el patró Singleton per assegurar-nos que només hi ha una instància de la base de dades a tota l'aplicació.

import android.content.Context
import androidx.room.Room

object DatabaseProvider {
    @Volatile
    private var INSTANCE: AppDatabase? = null

    fun getDatabase(context: Context): AppDatabase {
        return INSTANCE ?: synchronized(this) {
            val instance = Room.databaseBuilder(
                context.applicationContext,
                AppDatabase::class.java,
                "app_database"
            ).build()
            INSTANCE = instance
            instance
        }
    }
}

  1. Operacions Bàsiques de CRUD

Inserir un Usuari

val user = User(name = "John Doe", age = 30)
val db = DatabaseProvider.getDatabase(context)
db.userDao().insert(user)

Obtenir Tots els Usuaris

val users = db.userDao().getAllUsers()

Esborrar Tots els Usuaris

db.userDao().deleteAllUsers()

Exercicis Pràctics

Exercici 1: Afegir un Nou Camp a l'Entitat

  1. Afegiu un nou camp email a l'entitat User.
  2. Actualitzeu la base de dades per incloure el nou camp.
  3. Creeu una funció DAO per actualitzar l'email d'un usuari.

Solució

@Entity(tableName = "users")
data class User(
    @PrimaryKey(autoGenerate = true) val id: Int,
    val name: String,
    val age: Int,
    val email: String // Nou camp
)

@Dao
interface UserDao {
    @Insert
    suspend fun insert(user: User)

    @Query("SELECT * FROM users")
    suspend fun getAllUsers(): List<User>

    @Query("DELETE FROM users")
    suspend fun deleteAllUsers()

    @Query("UPDATE users SET email = :email WHERE id = :id")
    suspend fun updateEmail(id: Int, email: String) // Nova funció DAO
}

Resum

En aquesta secció, hem après a configurar Room en un projecte Android, crear entitats, DAOs i la base de dades, i realitzar operacions bàsiques de CRUD. Room simplifica la gestió de bases de dades en aplicacions Android, proporcionant una API més fàcil d'utilitzar i integrant-se amb altres components d'Android per a operacions asíncrones.

© Copyright 2024. Tots els drets reservats