Persistência Local com Room Database (@Entity, @Dao) e Migrações
Instruções Gerais:
- Resolva as atividades em ordem progressiva de maturidade.
- Cada nível adiciona requisitos técnicos, tratamento de erros e casos de borda reais.
- Consulte o gabarito comentado ao final de cada questão para autoavaliação.
🎯 Nível 1: Fundamentos
Problema 13.1 — Criação de Entidades e Chaves Primárias com @Entity
Contexto: Criação de Entidades e Chaves Primárias com @Entity no contexto de Persistência Local com Room Database (@Entity, @Dao) e Migrações.
Requisitos de Execução:
- Mapear tabela de banco de dados SQLite com
@Entity(tableName = 'contatos').
Resultado Esperado
Tabela de banco de dados mapeada com anotações do Room.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_13_1_SeuNome - Envie na tarefa:
Atividade Cap 13 - Persistência Local com Room Database (@Entity, @Dao) e Migrações
🔑 Gabarito de Código & Solução Comentada
package com.empresa.mobile.data
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "contatos")
data class ContatoEntity(
@PrimaryKey(autoGenerate = true) val id: Long = 0,
val nome: String,
val telefone: String
)
🔍 Nível 2: Prática
Problema 13.2 — Operações CRUD Assíncronas com @Dao e Flow Reativo
Contexto: Operações CRUD Assíncronas com @Dao e Flow Reativo no contexto de Persistência Local com Room Database (@Entity, @Dao) e Migrações.
Requisitos de Execução:
- Criar interface
@Daocom métodosinsert,deletee consulta retornandoFlow<List<ContatoEntity>>.
Resultado Esperado
DAO com consultas reativas integradas ao Flow do Kotlin.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_13_2_SeuNome - Envie na tarefa:
Atividade Cap 13 - Persistência Local com Room Database (@Entity, @Dao) e Migrações
🔑 Gabarito de Código & Solução Comentada
package com.empresa.mobile.data
import androidx.room.*
import kotlinx.coroutines.flow.Flow
@Dao
interface ContatoDao {
@Query("SELECT * FROM contatos ORDER BY nome ASC")
fun listarTodos(): Flow<List<ContatoEntity>>
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun salvar(contato: ContatoEntity)
@Delete
suspend fun remover(contato: ContatoEntity)
}
⚡ Nível 3: Integração
Problema 13.3 — Configuração de RoomDatabase com TypeConverters
Contexto: Configuração de RoomDatabase com TypeConverters no contexto de Persistência Local com Room Database (@Entity, @Dao) e Migrações.
Requisitos de Execução:
- Criar classe abstrata
@Databasee registrar@TypeConverterpara serialização dejava.time.Instant.
Resultado Esperado
Banco de dados Room configurado com conversores de tipos complexos.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_13_3_SeuNome - Envie na tarefa:
Atividade Cap 13 - Persistência Local com Room Database (@Entity, @Dao) e Migrações
🔑 Gabarito de Código & Solução Comentada
package com.empresa.mobile.data
import androidx.room.*
import java.time.Instant
class DateConverter {
@TypeConverter
fun fromTimestamp(value: Long?): Instant? = value?.let { Instant.ofEpochMilli(it) }
@TypeConverter
fun dateToTimestamp(date: Instant?): Long? = date?.toEpochMilli()
}
@Database(entities = [ContatoEntity::class], version = 1, exportSchema = false)
@TypeConverters(DateConverter::class)
abstract class AppDatabase : RoomDatabase() {
abstract fun contatoDao(): ContatoDao
}
🏆 Nível 4: Desafio Corporativo
Problema 13.4 — Migrações Automatizadas de Esquema (Migration Script)
Contexto: Migrações Automatizadas de Esquema (Migration Script) no contexto de Persistência Local com Room Database (@Entity, @Dao) e Migrações.
Requisitos de Execução:
- Escrever script de migração
Migration(1, 2)adicionando colunaemailsem perda de dados existentes.
Resultado Esperado
Migração de banco de dados corporativa executada com segurança.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_13_4_SeuNome - Envie na tarefa:
Atividade Cap 13 - Persistência Local com Room Database (@Entity, @Dao) e Migrações
🔑 Gabarito de Código & Solução Comentada
package com.empresa.mobile.data
import androidx.room.migration.Migration
import androidx.sqlite.db.SupportSQLiteDatabase
val MIGRATION_1_2 = object : Migration(1, 2) {
override fun migrate(db: SupportSQLiteDatabase) {
db.execSQL("ALTER TABLE contatos ADD COLUMN email TEXT NOT NULL DEFAULT ''")
}
}
fun validarMigration() = println("Migration 1->2 registrada com sucesso.")
| ⬅️ Voltar ao Índice de Exercícios | 📚 Sumário de Tópicos |