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:

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

  1. Salve o arquivo como: Atividade_13_1_SeuNome
  2. 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:

  1. Criar interface @Dao com métodos insert, delete e consulta retornando Flow<List<ContatoEntity>>.

Resultado Esperado

DAO com consultas reativas integradas ao Flow do Kotlin.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_13_2_SeuNome
  2. 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:

  1. Criar classe abstrata @Database e registrar @TypeConverter para serialização de java.time.Instant.

Resultado Esperado

Banco de dados Room configurado com conversores de tipos complexos.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_13_3_SeuNome
  2. 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:

  1. Escrever script de migração Migration(1, 2) adicionando coluna email sem perda de dados existentes.

Resultado Esperado

Migração de banco de dados corporativa executada com segurança.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_13_4_SeuNome
  2. 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