💾 Cap 15: Meus Jogos Favoritos (Room DB)

🎯 Objetivo da Aula: Ao final desta aula, você saberá criar um banco de dados interno no celular usando o Room. Você aprenderá a salvar informações de forma permanente (persistência), para que seus jogos favoritos não sumam quando o app fechar.


🏢 O Cenário Prático (Seu Desafio): Você tem muitos jogos e quer criar um catálogo pessoal. O desafio é criar o Vault Gamer: um banco de dados onde você pode salvar o nome do jogo, o console e a sua nota. Mesmo se você desligar o celular, sua lista continuará lá!


🧠 Fundamentos: A Teoria Traduzida

📖 Dicionário do Programador

🎨 O Padrão Room

Organize seu código na pasta data/local/:

  1. model/ -> Coloque sua @Entity aqui.
  2. dao/ -> Coloque sua @Dao aqui.
  3. Na raiz de data/local/ -> Coloque sua classe @Database (o “armário” que junta tudo).
graph TD
    A["Seu App"] --> B(DAO: O Gerente)
    B -->|Escreve/Lê| C[("Banco Room: O Arquivo")]

📦 Dependência Gradle

O Room não vem por padrão no projeto. Adicione no build.gradle (Module: app):

plugins {
    id 'kotlin-kapt'
}

dependencies {
    def room_version = "2.6.1"
    implementation "androidx.room:room-runtime:$room_version"
    implementation "androidx.room:room-ktx:$room_version"
    kapt "androidx.room:room-compiler:$room_version"
}

📖 Exemplo Passo a Passo: Criando o “Save Game”

  1. Defina a Tabela (Entity):
    @Entity(tableName = "jogos")
    data class JogoEntity(
        @PrimaryKey(autoGenerate = true) val id: Int = 0,
        val titulo: String,
        val plataforma: String
    )
    
  2. Crie o Controle (DAO):
    @Dao
    interface JogoDao {
        @Insert
        suspend fun adicionar(jogo: JogoEntity)
    
        @Query("SELECT * FROM jogos")
        suspend fun listarTodos(): List<JogoEntity>
    }
    
  3. Crie o Armário (Database): é a classe que liga a Entity ao DAO e cria o arquivo do banco no celular.
    import androidx.room.Database
    import androidx.room.RoomDatabase
    
    @Database(entities = [JogoEntity::class], version = 1)
    abstract class AppDatabase : RoomDatabase() {
        abstract fun jogoDao(): JogoDao
    }
    
  4. Construa o banco (uma única vez, ao iniciar o app):
    import android.content.Context
    import androidx.room.Room
    
    val db = Room.databaseBuilder(
        context, // Context da Activity ou Application
        AppDatabase::class.java,
        "vault_gamer.db"
    ).build()
    

🛠️ Prática Obrigatória 1: Crie uma Entity chamada PersonagemEntity. Ela deve ter um id (PrimaryKey), o nome e o level.


🛠️ Prática Obrigatória 2: Crie o DAO para salvar heróis. Ele deve ter uma função para salvar e uma função para buscarPorNome.


🛠️ Prática Obrigatória 3: Crie a classe AppDatabase, ligando PersonagemEntity ao PersonagemDao, e mostre como construí-la com Room.databaseBuilder.


🔑 Gabarito Passo a Passo:

// 1. A Tabela
@Entity(tableName = "personagens")
data class PersonagemEntity(
    @PrimaryKey(autoGenerate = true) val id: Int = 0,
    val nome: String,
    val level: Int
)

// 2. O Controle
@Dao
interface PersonagemDao {
    @Insert
    suspend fun salvar(p: PersonagemEntity)

    @Query("SELECT * FROM personagens WHERE nome = :nome")
    suspend fun buscarPorNome(nome: String): PersonagemEntity
}

// 3. O Armário
@Database(entities = [PersonagemEntity::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun personagemDao(): PersonagemDao
}

// 4. Construindo o banco
val db = Room.databaseBuilder(
    context,
    AppDatabase::class.java,
    "personagens.db"
).build()

💡 Conectando os pontos: JogoDao/PersonagemDao são interfaces — na vida real, isso permite trocar a implementação verdadeira por uma versão “de mentira” durante os testes, sem precisar de um banco de dados rodando. No Cap 21 você vai usar essa ideia (chamada de Mock) para testar funções que dependem de outros componentes.

📤 Instruções de Entrega (Microsoft Teams):

  1. Envie o código da sua Entity e do seu DAO.
  2. Nomeie como: Gamer_SeuNome_Cap15.kt.
  3. Submeta no canal de tarefas.

⬅️ Voltar para a Home