Boas Práticas no Armazenamento de Dados Mobile | [SIS]ANO2C1B2S8A4 | professorcomia.com.br
[SIS]ANO2C1B2S8A4 Unidade 2 · Componente 1 Armazenamento de dados e repositórios Aula 4 · Prática · Encerramento do bloco

Normalização, tipos de dados otimizados, índices para performance e CRUD com Room e Core Data — o fechamento técnico do bloco de armazenamento no ensino técnico de Desenvolvimento de Sistemas.

Desenvolvimento de Sistemas Android · iOS Room · Core Data · Índices Int · Float · Normalização Aula 4 · Prática · 40 min

Quando o código funciona mas o banco de dados é um problema esperando acontecer

Uma aplicação que funciona em testes com dez registros pode se tornar lenta com mil. Uma tabela que parece bem estruturada em um app simples pode gerar inconsistências em uma segunda versão. O código compila, o CRUD executa, o app entrega o resultado esperado — e ainda assim o banco de dados está mal projetado.

Esse é o desafio das boas práticas: elas não aparecem no primeiro teste. Aparecem quando o volume de dados cresce, quando uma coluna precisar ser filtrada frequentemente, quando uma mudança de nomenclatura exige atualizar 400 registros. São princípios de engenharia que separam o app que funciona do app que escala.

Esta última aula do bloco S8 fecha o ciclo com os quatro pilares das boas práticas no armazenamento mobile: normalização, tipos de dados corretos, índices e sincronização.

Custo de ignorar boas práticas: dados duplicados que divergem com o tempo, consultas lentas por ausência de índices, tipos de dados errados que desperdiçam espaço ou perdem precisão decimal, e apps frágeis que corrompem dados em quedas de conexão. Todos são problemas que o desenvolvedor carregará por toda a vida útil do produto.

O contexto da aula: encerramento técnico do bloco

Esta é a quarta e última aula do bloco S8 — Introdução ao Armazenamento de Dados. As aulas anteriores construíram progressivamente: tipos de armazenamento (A1), CRUD básico com uma entidade (A2), estrutura e relacionamentos entre entidades (A3). Agora o foco é a qualidade técnica do que foi construído.

Formato: 40 minutos, em grupo, com computador e internet. A atividade usa um contexto novo — app de registro de atividades físicas — para que o grupo aplique as boas práticas em um domínio diferente das aulas anteriores, consolidando a transferência de conhecimento.

≡ definição · boas práticas em armazenamento mobile

Conjunto de princípios técnicos que garantem desempenho, segurança e integridade em um banco de dados móvel: normalização para eliminar redundâncias, tipos de dados otimizados, índices para acelerar consultas e mecanismos de sincronização para resiliência.

Quais são as quatro boas práticas no armazenamento de dados mobile?

Normalização

Eliminar duplicação ao estruturar as tabelas. Dados relacionados ficam em entidades separadas, vinculadas por chaves estrangeiras.

{ }

Tipos de Dados

Usar o tipo correto: Int para inteiros, Float para decimais, String para texto. Evitar armazenar números como String.

#

Índices

Criar índices em colunas frequentemente pesquisadas (como categoriaId) para acelerar consultas sem varrer a tabela inteira.

Sincronização e Backup

Implementar mecanismos para sincronizar dados locais com o servidor e garantir resiliência em quedas de conexão ou falhas do dispositivo.

Por que tipos de dados importam na prática?

No app de atividades físicas, a duração é armazenada como Int (minutos são números inteiros — não existe “30,5 minutos” como dado de usuário). A distância é armazenada como Float porque 5,3 km é um valor decimalmente válido e relevante. Armazenar a distância como Int truncaria os decimais; como String, impediria comparações e somas numéricas diretas no banco.

A escolha de tipo não é trivial: impacta o espaço em disco, a performance de consultas numéricas e a precisão dos dados — especialmente em apps de saúde ou fitness onde os valores decimais têm significado real.

O que é um índice no banco de dados e como declarar no Room?

Um índice é uma estrutura auxiliar que o banco de dados mantém para localizar registros rapidamente sem varrer toda a tabela. É análogo ao índice de um livro: em vez de ler página por página, você vai diretamente ao número de página do termo buscado. No Room, índices são declarados na anotação @Entity:

Implementação com boas práticas: app de atividades físicas

Template 1 — Entidades com tipos otimizados e índice em categoriaId

Atividade.kt · Categoria.kt — boas práticas ▶ Kotlin
// Boa prática: índice em coluna frequentemente pesquisada @Entity( tableName = "atividades", indices = [Index(value = ["categoriaId"])] // acelera filtros por categoria ) data class Atividade( @PrimaryKey(autoGenerate = true) val id: Int = 0, val nome: String, val duracao: Int, // Int: minutos são sempre inteiros val distancia: Float, // Float: distância em km com precisão decimal val categoriaId: Int // FK → Categoria.id (indexada acima) )@Entity(tableName = "categorias") data class Categoria( @PrimaryKey(autoGenerate = true) val id: Int = 0, val nome: String // "Aeróbico", "Musculação", "Ciclismo" )

Template 2 — DAOs com CRUD completo para as duas entidades

AtividadeDao.kt · CategoriaDao.kt · AppDatabase.kt ▶ Kotlin
@Dao interface AtividadeDao { @Insert fun inserirAtividade(a: Atividade)// Filtro usa o índice de categoriaId — consulta rápida @Query("SELECT * FROM atividades WHERE categoriaId = :categoriaId") fun obterAtividadesPorCategoria(categoriaId: Int): List<Atividade>@Update fun atualizarAtividade(a: Atividade) @Delete fun removerAtividade(a: Atividade) }@Dao interface CategoriaDao { @Insert fun inserirCategoria(c: Categoria) @Query("SELECT * FROM categorias") fun obterTodasCategorias(): List<Categoria> }@Database(entities = [Atividade::class, Categoria::class], version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun atividadeDao(): AtividadeDao abstract fun categoriaDao(): CategoriaDao }

Template 3 — Tabela de tipos de dados e quando usar cada um

TipoUso corretoExemplo no appEvitar
IntValores inteiros sem casas decimaisduracao: Int (minutos: 30, 45, 60)Usar Long quando Int é suficiente
FloatValores decimais com precisão simplesdistancia: Float (km: 5.3, 10.7)Usar String para armazenar números decimais
StringTexto de comprimento variávelnome: String (“Corrida matinal”)Usar para armazenar datas ou booleanos
BooleanValor binário verdadeiro/falsoativo: Boolean (categoria ativa)Usar String “true”/”false” em vez de Boolean
LongTimestamps, IDs de alta cardinalidadedataHora: Long (Unix timestamp)Usar onde Int é suficiente

Caso aplicado: app de atividades físicas com boas práticas

{ } caso real · ensino médio técnico · SEDUC-SP · grupo · 40 min

Contexto: o grupo foi “contratado” para desenvolver um app de registro de atividades físicas — corridas, treinos, ciclismo. O app registra duração (em minutos), distância (em km) e categoria de cada atividade. A entidade Atividade precisa de duracao: Int e distancia: Float — escolha deliberada de tipos que o grupo precisa justificar no texto-síntese.

Boa prática que o grupo precisa implementar: adicionar o índice em categoriaId via indices = [Index(value = ["categoriaId"])] na anotação @Entity. Essa linha única tem impacto direto na performance de todas as consultas filtradas por categoria — o grupo precisa entender o porquê, não apenas copiar.

Perguntas do roteiro: importância da normalização; como índices melhoram a performance; quais tipos de dados foram usados e por quê. As respostas devem conectar as decisões técnicas implementadas com os princípios das boas práticas.

→ expansão estratégica · 4 frentes de aplicação
>_

Projeto Integrador

App de saúde escolar com índices em colunas de busca frequente — projeto de conclusão que demonstra engenharia de dados, não apenas implementação.

{ }

Blog / Autoridade

Artigo comparativo: “O custo de ignorar boas práticas em banco de dados mobile” — benchmarks com e sem índice, normalizado vs desnormalizado.

Cultura Maker

App de monitoramento de equipamentos do fab lab — registro de uso com tipos corretos (Float para voltagem, Int para ciclos) e índice em equipamentoId.

Formação Docente

Rubrica de qualidade técnica para projetos mobile: normalização, tipos corretos, índices e tratamento de erros como critérios mensuráveis de avaliação.

Síntese do bloco S8: ao criar um banco de dados para app móvel, é fundamental seguir boas práticas para garantir desempenho, segurança e integridade. Room (Android) e Core Data (iOS) implementam CRUD com APIs robustas. Normalização elimina redundâncias, tipos corretos otimizam armazenamento, índices aceleram consultas, e mecanismos de sync garantem resiliência — esses quatro princípios transformam um banco funcional em um banco profissional.

Perguntas frequentes sobre boas práticas no armazenamento mobile

O que são boas práticas no armazenamento de dados em apps móveis?

Boas práticas incluem normalização (eliminar duplicação), uso correto de tipos de dados (Int, Float, String conforme o valor), criação de índices em colunas frequentemente pesquisadas, e implementação de mecanismos de sincronização e backup para garantir integridade e resiliência.

Por que é importante normalizar os dados ao criar um banco de dados móvel?

A normalização elimina duplicação e assegura que informações relacionadas estejam organizadas eficientemente. Em apps móveis, onde armazenamento e performance são recursos limitados, a normalização impacta diretamente a velocidade de consulta e o consumo de bateria.

Como o uso de índices melhora a performance do banco de dados móvel?

Índices em colunas frequentemente pesquisadas, como categoriaId, permitem que o banco localize rapidamente os registros sem varrer a tabela inteira. No Room, são declarados via indices = [Index(value = [“coluna”])] na anotação @Entity. Em apps com muitos registros, a diferença de tempo entre uma consulta com e sem índice pode ser de milissegundos versus segundos.

Quais tipos de dados usar para otimizar o armazenamento em banco de dados mobile?

Use Int para valores inteiros como duração em minutos. Use Float para valores decimais como distância em km. Use String para texto. Evite armazenar números como String — além de ocupar mais espaço, impede cálculos diretos e degrada a performance de consultas numéricas.

Qual a diferença entre RAM, SharedPreferences e SQLite em aplicações móveis?

RAM armazena dados temporários perdidos ao fechar o app. SharedPreferences e UserDefaults armazenam preferências simples do usuário como tema e notificações. SQLite (via Room ou Core Data) é o banco de dados relacional para consultar e manipular grandes volumes de dados estruturados com persistência e suporte a filtros.

>_ Série completa S8 — Introdução ao Armazenamento de Dados

Todas as 4 aulas do bloco, roteiros de atividade prática e templates de código disponíveis no blog do Professor Comia.

acessar professorcomia.com.br →

Conclusão: da implementação à engenharia

Implementar um CRUD que funciona é o ponto de partida, não o destino. A distância entre um desenvolvedor que faz o banco de dados funcionar e um desenvolvedor que faz o banco de dados funcionar bem está precisamente nestes quatro princípios: normalização, tipos corretos, índices e resiliência.

O estudante que termina este bloco com esses conceitos internalizados não apenas sabe usar Room ou Core Data — sabe avaliar a qualidade do que implementou e identificar o que pode ser melhorado. Essa capacidade analítica é o que transforma competência técnica em autoridade profissional.

[SIS]ANO2C1B2S8A4 · Unidade 2 · Componente 1 · Boas práticas no armazenamento de dados · Aula 4 · Encerramento do bloco S8
professorcomia.com.br · diariodeumpoed.com.br · POED SEDUC-SP

// slides de aula · [SIS]ANO2C1B2S8A4 · boas práticas · quiz × 3 · aula prática

>_ Boas Práticas no Armazenamento de Dados

abertura · slide_01
frequência · registrar presença agora

Código: [SIS]ANO2C1B2S8A4  ·  Unidade 2 · Componente 1 · Aula 4 · Encerramento S8

Aula 4 — Boas práticas no armazenamento de dados · Prática em grupo · 40 minutos

? Você criou um banco de dados que funciona. Mas ele vai continuar funcionando bem quando houver 10.000 registros? Como garantir que ele seja rápido, organizado e confiável?

[ ] Objetivos da Aula

objetivos · slide_02
  • conceitual Aplicar boas práticas no armazenamento de dados: normalização, tipos otimizados, índices e sincronização
  • procedimental Criar um banco de dados com boas práticas usando Room (Android) ou Core Data (iOS) para um app de atividades físicas
  • atitudinal Desenvolver o hábito de avaliar a qualidade técnica de um banco de dados, não apenas sua funcionalidade
≡ recursos · audiovisual · lápis e caderno · computador com internet

! Problema Gerador

problema_gerador · slide_03

Um app de atividades físicas precisa registrar corridas, treinos e ciclismo — com duração (minutos), distância (km) e categoria. O banco de dados funciona nos testes, mas ao crescer para milhares de registros, as consultas por categoria ficam lentas.

! problema de tipo

A distância foi salva como String (“5.3”). O app não consegue somar distâncias diretamente no banco nem comparar valores. Como corrigir?

! problema de performance

A consulta WHERE categoriaId = ? varre a tabela inteira a cada busca. Com 50.000 registros, demora segundos. Qual o princípio de engenharia que resolve isso?

? Um banco de dados funcionando é suficiente — ou precisa também ser correto, eficiente e seguro?

Os 4 Pilares das Boas Práticas

conceito · slide_04
  • Normalização · evitar duplicações e redundâncias ao estruturar tabelas — entidades separadas vinculadas por FK
  • Tipos de dados corretos · Int para inteiros, Float para decimais, String para texto — nunca armazenar números como String
  • Índices · utilizar índices em colunas frequentemente pesquisadas (ex: categoriaId) para acelerar consultas
  • Sincronização e backup · implementar mecanismos para dados locais sincronizarem com o servidor e resistirem a falhas

# Tipos Otimizados e Índice no Room

conceito · slide_05

Int para duração (minutos inteiros) · Float para distância (km decimais) · índice em categoriaId via anotação.

Atividade.kt — @Entity com @Index ▶ Kotlin
@Entity(
    tableName = "atividades",
    indices = [Index(value = ["categoriaId"])]
)
data class Atividade(
    @PrimaryKey(autoGenerate = true) val id: Int = 0,
    val nome: String,
    val duracao: Int,     // minutos
    val distancia: Float, // km
    val categoriaId: Int  // FK indexada
)

Caderno — Definições da Aula

caderno · slide_06
  • Boas práticas de BD · princípios que garantem desempenho, segurança e integridade dos dados
  • Normalização · eliminar duplicações ao separar dados em tabelas relacionadas por FK
  • Índice (@Index) · estrutura auxiliar que acelera buscas em colunas frequentemente pesquisadas
  • Int · tipo para valores inteiros; ideal para duração em minutos, contadores, IDs
  • Float · tipo para decimais de precisão simples; ideal para distâncias em km, percentuais
  • Sincronização · mecanismo que envia dados locais para o servidor quando a conexão é restabelecida
  • Backup · cópia de segurança do banco para resiliência a falhas de hardware ou software
  • RAM (memória volátil) · armazena dados temporários; perdidos ao fechar o app

? Pause e Responda

pause_e_responda · slide_07 quiz 1/3
? registre sua resposta no caderno antes de continuar
Qual é a função da memória volátil (RAM)?
Indique a alternativa correta.
  • A Armazena preferências de usuário.
  • B Armazena dados permanentemente.
  • C Armazena dados temporários.
  • D Lida com grandes volumes de dados.

≡ responda no caderno → depois registre no AVA

Gabarito — Quiz 1

gabarito · slide_08 quiz 1/3
Qual é a função da memória volátil (RAM)?
  • A Armazena preferências de usuário. → SharedPreferences / UserDefaults
  • B Armazena dados permanentemente. → banco de dados / arquivos locais
  • C Armazena dados temporários.
  • D Lida com grandes volumes de dados. → banco de dados local (SQLite/Room)
✓ Correto. A RAM armazena dados temporários, que são perdidos ao fechar o aplicativo.

? Pause e Responda

pause_e_responda · slide_09 quiz 2/3
? registre sua resposta no caderno antes de continuar
Para que é mais indicado o uso de SharedPreferences e UserDefaults?
Indique a alternativa correta.
  • A Grandes volumes de dados.
  • B Dados temporários.
  • C Preferências de usuário.
  • D Imagens e vídeos.

≡ responda no caderno → depois registre no AVA

Gabarito — Quiz 2

gabarito · slide_10 quiz 2/3
Para que é mais indicado o uso de SharedPreferences e UserDefaults?
  • A Grandes volumes de dados. → banco de dados local (SQLite/Room)
  • B Dados temporários. → memória volátil (RAM)
  • C Preferências de usuário.
  • D Imagens e vídeos. → arquivos locais no sistema de arquivos
✓ Muito bem! SharedPreferences e UserDefaults são ideais para armazenar preferências de usuário.

? Pause e Responda

pause_e_responda · slide_11 quiz 3/3
? registre sua resposta no caderno antes de continuar
Qual é o uso adequado de um banco de dados local, como SQLite?
Indique a alternativa correta.
  • A Armazenar pares chave-valor.
  • B Armazenar arquivos não estruturados.
  • C Armazenar dados temporários.
  • D Consultar e manipular dados.

≡ responda no caderno → depois registre no AVA

Gabarito — Quiz 3

gabarito · slide_12 quiz 3/3
Qual é o uso adequado de um banco de dados local, como SQLite?
  • A Armazenar pares chave-valor. → SharedPreferences / UserDefaults
  • B Armazenar arquivos não estruturados. → sistema de arquivos local
  • C Armazenar dados temporários. → memória volátil (RAM)
  • D Consultar e manipular dados.
✓ Correto. O SQLite é ideal para consultar e manipular dados estruturados com eficiência.

{ } Contexto da Atividade Prática

contexto_atividade · slide_13

Título: Boas práticas no armazenamento de dados e criação de banco de dados em aplicações móveis

Formato: em grupo · 40 minutos · computador com internet · entrega no AVA

Objetivo: criar um banco de dados para app de atividades físicas aplicando boas práticas — normalização, tipos otimizados e índice em categoriaId.

{ } atividade

id Int · PK

nome String

duracao Int · minutos

distancia Float · km

categoriaId Int · FK + índice

{ } categoria

id Int · PK

nome String

Ex: “Aeróbico”, “Musculação”, “Ciclismo”

Planejamento — Boas Práticas em Foco

planejamento · slide_14

Esboçar no papel antes de codificar — com atenção aos tipos de dados.

∑ decisões de tipo

duracao: Int — minutos são inteiros

distancia: Float — km tem casas decimais

nome: String — texto de comprimento variável

categoriaId: Int — FK + índice declarado

# boa prática obrigatória

Adicionar indices = [Index(value = ["categoriaId"])] na anotação @Entity da Atividade.

∑ Decisão do grupo: qual o impacto de armazenar distancia como Int em vez de Float? Incluir no texto-síntese.

>_ Fluxo Lógico da Implementação

algoritmo · slide_15
  • 1 Configurar dependências Room + kapt no build.gradle e sincronizar
  • 2 Criar @Entity Atividade com tipos corretos (Int, Float) e o índice em categoriaId
  • 3 Criar @Entity Categoria com id e nome
  • 4 Criar AtividadeDao com inserção, busca por categoria, atualização e remoção
  • 5 Criar CategoriaDao com inserção e listagem
  • 6 Criar AppDatabase com as duas entidades e dois DAOs
  • 7 Executar: categoria → atividades → filtro por categoria → verificar índice ativo

Implementação — Orientações de IDE

implementacao · slide_16
◉ android studio

Após adicionar o índice na entidade, rodar Build > Clean Project e reconstruir — o Room precisa regenerar o arquivo de banco.

Operações em Thread {} separada — Room proíbe main thread.

◉ xcode (ios)

No Data Model Editor: adicionar atributo distancia como tipo Float (não String nem Double). Relação categoria como apontador para a entidade Categoria.

  • Verificação de tipos · conferir que duracao é Int e distancia é Float — não String
  • Verificação de índice · conferir que indices = [Index(value = ["categoriaId"])] está na anotação @Entity

! Casos de Teste — Boas Práticas em Ação

testes · slide_17
✓ tipos corretos

Inserir atividade com duracao = 30 (Int) e distancia = 5.3f (Float).

Esperado: dados recuperados com precisão decimal — 5.3, não 5.

! índice funcionando

Inserir 5 atividades em 2 categorias. Filtrar por categoria.

Esperado: consulta retorna apenas as atividades da categoria filtrada sem varrer registros das demais.

∅ sem duplicação

Renomear uma categoria no banco.

Esperado: todas as atividades daquela categoria refletem o novo nome — normalização em ação.

! Anotar no caderno a justificativa do tipo escolhido para cada campo — parte obrigatória do texto-síntese.

Entrega no AVA

entrega_ava · slide_18

Envie o texto-síntese com as respostas às três perguntas do roteiro:

⌨ o que incluir

Pergunta 1 — Por que é importante normalizar os dados ao criar um banco de dados móvel?

Pergunta 2 — Como o uso de índices pode melhorar a performance do banco de dados?

Pergunta 3 — Quais tipos de dados foram utilizados para otimizar o armazenamento e por quê?

✓ critérios de avaliação

Justificativa técnica dos tipos de dados escolhidos.

Explicação correta do papel dos índices na performance.

Conexão entre normalização e integridade dos dados.

⌨ entrega · texto/síntese no AVA · mínimo 15 linhas · todos os nomes do grupo · encerramento do bloco S8

Então Ficamos Assim… · Encerramento S8

sintese · slide_19

Boas Práticas

Ao criar um BD mobile, seguir normalização, tipos corretos, índices e sincronização garante desempenho, segurança e integridade.

{ }

Room e Core Data

Frameworks para banco de dados local em Android e iOS que facilitam o CRUD com APIs robustas e validação em tempo de compilação.

#

CRUD com Qualidade

Create, Read, Update e Delete implementados com tipos otimizados e índices garantem operações eficientes mesmo com grandes volumes.

← bloco s8 — resumo

A1 Tipos de armazenamento → A2 CRUD básico → A3 Estrutura e relações → A4 Boas práticas

→ próximo bloco

Implementação de banco de dados avançado · Integração de repositórios com APIs externas · Bloco 9

📘 Gostou do que viu aqui no laboratório? No Professor com IA eu mostro, passo a passo, como você também pode criar ferramentas assim — mesmo sem saber programar.