💾 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
- Entity (Entidade): É a “Tabela” do banco. Cada linha da tabela é um jogo. No Kotlin, é uma
data class. - DAO (Data Access Object): É o “Controle Remoto” do banco. É onde você cria os botões: “Salvar”, “Deletar” ou “Ver Tudo”.
- Primary Key (Chave Primária): É o CPF de cada registro. Cada jogo terá um número único para o banco não se confundir.
🎨 O Padrão Room
Organize seu código na pasta data/local/:
model/-> Coloque sua@Entityaqui.dao/-> Coloque sua@Daoaqui.- 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”
- Defina a Tabela (Entity):
@Entity(tableName = "jogos") data class JogoEntity( @PrimaryKey(autoGenerate = true) val id: Int = 0, val titulo: String, val plataforma: String ) - Crie o Controle (DAO):
@Dao interface JogoDao { @Insert suspend fun adicionar(jogo: JogoEntity) @Query("SELECT * FROM jogos") suspend fun listarTodos(): List<JogoEntity> } - 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 } - 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/PersonagemDaosã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):
- Envie o código da sua Entity e do seu DAO.
- Nomeie como:
Gamer_SeuNome_Cap15.kt. - Submeta no canal de tarefas.