Armazenamento de Dados em Apps Móveis | [SIS]ANO2C1B2S8A1 | professorcomia.com.br
[SIS]ANO2C1B2S8A1 Unidade 2 · Componente 1 Armazenamento de dados e repositórios

Conceitos básicos de armazenamento, comparação entre estratégias e sincronização off-line para o desenvolvimento mobile no ensino técnico.

Desenvolvimento de Sistemas Android · iOS SQLite · Room · Core Data Ensino Médio Técnico

Por que o app do seu aluno perde dados ao fechar?

O cenário é recorrente nas aulas de programação mobile: o estudante constrói um aplicativo funcional, insere dados, testa a interface — e ao fechar e reabrir o app, tudo desapareceu. A interface funciona. A lógica está correta. Mas os dados não persistiram.

O problema não é de código. É de arquitetura: nenhuma estratégia de armazenamento foi escolhida conscientemente. Os dados vivem apenas na memória volátil — e a memória volátil existe exatamente para ser descartada.

Entender quando e como armazenar informações é a diferença entre um protótipo de aula e uma aplicação que funciona no mundo real. Este artigo percorre os quatro tipos de armazenamento em dispositivos móveis, explica os critérios de escolha e mostra como garantir sincronização de dados off-line — competência central no desenvolvimento profissional de apps.

Custo concreto de não dominar o tema: uma aplicação de gestão de tarefas que perde dados ao ser fechada não chega à fase de testes reais. Um app de agendamento escolar sem persistência é inutilizável. No mercado, falhas de armazenamento e sincronização off-line estão entre as principais causas de avaliações negativas em lojas de aplicativos — e de retrabalho caro em times de desenvolvimento.

O cenário do ensino técnico: tempo limitado, decisões reais

No curso técnico de Desenvolvimento de Sistemas (SEDUC-SP), a aula de armazenamento de dados precisa cumprir um papel duplo: construir a base conceitual que diferencia cada tipo de armazenamento e conectar essa base a decisões técnicas reais de projeto. Tempo disponível: aproximadamente 50 minutos, incluindo atividade de aplicação.

A infraestrutura escolar — computadores compartilhados, conexão instável, ausência de emuladores Android/iOS configurados — reforça a necessidade de ensinar o raciocínio por trás da escolha antes da implementação. O estudante que compreende o critério de decisão consegue aplicar o conceito independentemente da ferramenta disponível.

≡ definição · armazenamento de dados em mobile

Conjunto de mecanismos que permitem a um aplicativo móvel salvar, recuperar e gerenciar informações além do ciclo de vida da execução — diferenciando-se pela estrutura dos dados, volume, durabilidade e necessidade de consulta.

Quais são os quatro tipos de armazenamento em dispositivos móveis?

Cada tipo de armazenamento responde a um conjunto específico de requisitos. A escolha errada gera perdas de dados, lentidão ou complexidade desnecessária.

TipoTecnologiaPersiste?Ideal paraLimite prático
Memória VolátilRAM / variáveisNãoDados temporários de sessão, estado de UIPerdido ao fechar o app
SharedPreferences / UserDefaultsPares chave-valorSimPreferências simples: tema, idioma, notificaçõesNão adequado para coleções ou dados relacionais
Arquivos LocaisJSON, XML, PDF, imagensSimDados não estruturados, mídia, exportaçõesSem suporte nativo a consultas ou relações
Banco de Dados LocalSQLite / Room / Core DataSimDados relacionais, consultas complexas, grandes volumesRequer modelagem prévia e mais código

Memória Volátil (RAM)

Todo dado armazenado em variáveis, listas ou objetos dentro de uma função vive na RAM. É a forma mais rápida de acesso, mas completamente descartável: encerrar o app ou navegar para outra tela pode destruir esses dados. Use exclusivamente para estado transitório de interface ou cálculos intermediários que não precisam sobreviver à sessão.

SharedPreferences (Android) e UserDefaults (iOS)

Ambas as APIs armazenam pares chave-valor de forma persistente em um arquivo de configuração gerenciado pelo sistema. São ideais para configurações do usuário — tema claro/escuro, preferências de notificação, último estado de tela visitada. A leitura e a escrita são síncronas e extremamente rápidas para pequenas quantidades de dados.

Arquivos Locais

O sistema de arquivos do dispositivo aceita qualquer tipo de dado binário ou textual: imagens capturadas pela câmera, PDFs gerados pelo app, arquivos JSON de exportação, gravações de áudio. São acessados diretamente pelo caminho no sistema de arquivos. Não oferecem mecanismo nativo de busca ou filtragem — para consultas, um banco de dados é mais adequado.

Banco de Dados Local: SQLite, Room e Core Data

O SQLite é o mecanismo de banco de dados relacional embutido em todos os dispositivos Android e iOS. No Android, a biblioteca Room (parte do Android Jetpack) fornece uma camada de abstração sobre o SQLite via anotações Kotlin, eliminando código boilerplate e validando consultas em tempo de compilação. No iOS, o Core Data oferece camada equivalente com suporte a mapeamento objeto-relacional e gerenciamento de contextos de dados.

Como escolher a estratégia de armazenamento correta?

{ } método estruturado · decisão de armazenamento
  1. Defina a durabilidade necessária: os dados precisam sobreviver ao fechamento do app? Se não, RAM é suficiente. Se sim, prossiga.
  2. Avalie a estrutura dos dados: são um ou dois valores isolados (tema, flag de onboarding)? SharedPreferences/UserDefaults. São arquivos binários (fotos, PDFs)? Arquivos locais.
  3. Verifique a necessidade de consulta: o app precisará filtrar, ordenar ou relacionar os dados? Banco de dados local (SQLite/Room/Core Data).
  4. Considere o volume: acima de algumas dezenas de registros com campos variados, a estrutura relacional de um banco de dados compensa o custo de modelagem.
  5. Avalie o requisito off-line: o app precisa funcionar sem internet e sincronizar depois? Banco de dados local + fila de sincronização é a arquitetura correta.

Implementação prática: Room (Android) e Core Data (iOS)

Template 1 — Banco de Dados com Room (Android/Kotlin)

O exemplo abaixo define uma entidade Task, um DAO com operações básicas e a flag pendingSync para controle de sincronização off-line.

TaskDatabase.kt — Android · Room ▶ Kotlin
// 1. Entidade — mapeada à tabela "tasks" @Entity(tableName = "tasks") data class Task( @PrimaryKey(autoGenerate = true) val id: Int = 0, val titulo: String, val concluida: Boolean = false, val pendingSync: Boolean = false )// 2. DAO — interface de acesso a dados @Dao interface TaskDao { @Query("SELECT * FROM tasks") fun getAllTasks(): List<Task>@Insert suspend fun insertTask(task: Task)@Query("SELECT * FROM tasks WHERE pendingSync = 1") fun getPendingSyncTasks(): List<Task>@Update suspend fun updateTask(task: Task) }// 3. Database — ponto de entrada do Room @Database(entities = [Task::class], version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun taskDao(): TaskDao }

Template 2 — Banco de Dados com Core Data (iOS/Swift)

No iOS, o Core Data gerencia o ciclo de vida dos objetos persistidos via NSManagedObjectContext. O padrão de fetch e save é consistente em toda a API.

TaskRepository.swift — iOS · Core Data ▶ Swift
import CoreDataclass TaskRepository { private let context: NSManagedObjectContextinit(context: NSManagedObjectContext) { self.context = context }// Inserir nova tarefa func insertTask(titulo: String) { let novaTarefa = Task(context: context) novaTarefa.titulo = titulo novaTarefa.concluida = false novaTarefa.pendingSync = true try? context.save() }// Buscar todas as tarefas func fetchAllTasks() -> [Task] { let request: NSFetchRequest<Task> = Task.fetchRequest() return (try? context.fetch(request)) ?? [] }// Buscar apenas pendentes de sincronização func fetchPendingSync() -> [Task] { let request: NSFetchRequest<Task> = Task.fetchRequest() request.predicate = NSPredicate(format: "pendingSync == true") return (try? context.fetch(request)) ?? [] } }

Template 3 — Sincronização Off-line com WorkManager (Android)

SyncWorker.kt — Android · WorkManager ▶ Kotlin
class SyncWorker( ctx: Context, params: WorkerParameters ) : CoroutineWorker(ctx, params) {override suspend fun doWork(): Result { return try { sincronizarTarefasPendentes() Result.success() } catch (e: Exception) { Result.retry() // tenta novamente depois } } }// Agendar worker com restrição de conectividade val constraints = Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED) .build()val syncRequest = OneTimeWorkRequestBuilder<SyncWorker>() .setConstraints(constraints) .build()WorkManager.getInstance(context).enqueue(syncRequest)

Caso aplicado: app de lista de tarefas em escola pública

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

Cenário proposto na aula: um estudante desenvolve um aplicativo de lista de tarefas para o dispositivo móvel. Os usuários precisam adicionar tarefas diárias, e os dados precisam estar disponíveis após fechar o app. O requisito crítico: o app deve funcionar mesmo sem conexão, sincronizando com o servidor quando a internet for restabelecida.

Decisão de armazenamento correta: banco de dados local (Room no Android, Core Data no iOS) com campo pendingSync em cada registro. Ao criar uma tarefa off-line, o campo é marcado como true. Um worker em segundo plano (WorkManager/BackgroundTasks) processa a fila de sincronização sequencialmente assim que a conexão for detectada.

Este mesmo padrão é aplicável a qualquer app escolar: diário de frequência off-line, formulários de avaliação sem internet, checklist de atividades em campo — todos resolvidos com a mesma arquitetura de persistência local + fila de sync.

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

Curso Técnico

Modelagem de banco de dados como projeto integrador: app de controle de inventário da escola com Room + sincronização com Firebase.

{ }

Blog / Autoridade

Série de posts comparando estratégias de armazenamento mobile com exemplos reais desenvolvidos em aula — conteúdo de alta busca técnica.

Cultura Maker

App de registro de projetos do laboratório maker: fotos, descrições e status sincronizados com servidor escolar — desenvolvido pelos alunos.

Formação de Professores

Oficina para docentes: “como avaliar projetos mobile que incluem persistência de dados” — critério técnico aplicado à rubrica avaliativa.

Síntese: memória volátil, SharedPreferences/UserDefaults, arquivos locais e banco de dados local respondem a necessidades distintas. A decisão correta depende de durabilidade, estrutura, volume e requisito de consulta. Para apps com funcionamento off-line, a combinação banco de dados local + fila de sincronização + worker em segundo plano é o padrão profissional.

Perguntas frequentes sobre armazenamento mobile

Qual a diferença entre memória volátil e armazenamento persistente em apps móveis?

A memória volátil (RAM) armazena dados apenas durante a execução do aplicativo — ao fechar, tudo é perdido. O armazenamento persistente (SharedPreferences, banco de dados, arquivos) mantém os dados entre sessões, essencial para apps que precisam preservar estado do usuário.

Quando usar SQLite/Room em vez de SharedPreferences?

Use SharedPreferences apenas para pares chave-valor simples como preferências de tema ou notificações. Opte por SQLite/Room quando precisar armazenar coleções de registros estruturados, realizar consultas (filtros, ordenações) ou gerenciar relacionamentos entre entidades de dados.

O que é Room e qual sua relação com SQLite?

Room é uma biblioteca de abstração sobre o SQLite para Android, parte do Android Jetpack. Ela fornece anotações Kotlin/Java para mapear classes a tabelas (@Entity), interfaces para operações (@Dao) e configuração do banco (@Database), eliminando código boilerplate e prevenindo erros em tempo de compilação.

Como funciona a sincronização de dados off-line com o servidor?

A estratégia mais robusta combina: armazenamento local com flag pendingSync=true para operações criadas off-line; fila de sincronização processada sequencialmente; executor em segundo plano (WorkManager no Android, BackgroundTasks no iOS) que dispara automaticamente quando a conexão é restabelecida.

Apps móveis precisam necessariamente de banco de dados?

Não. Apps simples que apenas exibem informações estáticas ou armazenam uma ou duas preferências do usuário funcionam bem com SharedPreferences ou arquivos. O banco de dados local justifica-se quando há múltiplas entidades, relacionamentos entre dados, necessidade de consultas ou operações off-line com sincronização posterior.

>_ Mais aulas do curso técnico de Desenvolvimento de Sistemas

Acompanhe a sequência completa da Unidade 2 — Armazenamento de Dados e Repositórios — no blog do Professor Comia.

acessar professorcomia.com.br →

Conclusão: persistência de dados é decisão de projeto, não de código

Ensinar armazenamento de dados no ensino técnico não é ensinar uma API. É ensinar o raciocínio que antecede qualquer linha de código: que tipo de dado é esse? Quanto tempo precisa existir? Quem vai acessá-lo? Qual o volume esperado?

Quando o estudante internaliza esses quatro critérios — durabilidade, estrutura, volume e necessidade de consulta — a escolha entre RAM, SharedPreferences, arquivo local ou banco de dados deixa de ser tentativa e erro e passa a ser decisão arquitetural fundamentada. Essa mudança de mentalidade é o que distingue o desenvolvedor que codifica da situação daquele que projeta soluções.

[SIS]ANO2C1B2S8A1 · Unidade 2 · Componente 1 · Armazenamento de dados e repositórios
professorcomia.com.br · diariodeumpoed.com.br · POED SEDUC-SP

// slides de aula · [SIS]ANO2C1B2S8A1 · apresentação

>_ Armazenamento de Dados em Apps Móveis

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

Código: [SIS]ANO2C1B2S8A1  ·  Unidade 2 · Componente 1

Aula 1 — Conceitos básicos de armazenamento de dados · Armazenamento de dados e repositórios

? Você já perdeu dados em algum app no celular? Sabe por que isso acontece?

[ ] Objetivos da Aula

objetivos · slide_02
  • conceitual Conhecer os principais tipos de armazenamento de dados em aplicações móveis
  • procedimental Criar um banco de dados básico para uma aplicação móvel
  • atitudinal Promover a curiosidade e o interesse em novas maneiras de armazenar dados
≡ recursos · recurso audiovisual para exibição · lápis e caderno para anotações

! Ponto de Partida

problema_gerador · slide_03

Você está desenvolvendo um aplicativo de lista de tarefas. Os dados precisam ser salvos para que o usuário os acesse mesmo após fechar o app — e o app precisa funcionar sem conexão, sincronizando com o servidor quando a internet retornar.

! problema 1

Como garantir que as tarefas criadas não desapareçam ao fechar o aplicativo?

! problema 2

Como funcionar sem internet e sincronizar os dados quando a conexão for restabelecida?

? Como armazenar os dados das tarefas de forma eficiente em um dispositivo móvel?

{ } Tipos de Armazenamento em Dispositivos Móveis

conceito · slide_04
∅ RAM

Memória Volátil — dados temporários, perdidos ao fechar o app. Ideal para estado de UI.

≡ chave-valor

SharedPreferences / UserDefaults — preferências simples: tema, notificações.

{ } arquivos

Arquivos Locais — JSON, PDF, imagens. Dados não estruturados ou exportações.

# banco

Banco de Dados Local — SQLite, Room, Core Data. Dados relacionais e consultas.

Quando Usar Cada Tipo

conceito · slide_05
  • Memória (RAM) · dados que só existem enquanto o app está em execução. Ex: resultado de cálculo intermediário, estado atual da tela.
  • SharedPreferences / UserDefaults · configurações simples. Ex: tema claro/escuro, preferência de notificações.
  • Arquivos Locais · dados grandes em formato de arquivo. Ex: fotos, PDFs, gravações de áudio anexadas a notas.
  • Banco de Dados Local · dados relacionais com consultas frequentes. Ex: lista de tarefas, agenda de contatos, histórico de transações.

# Banco de Dados Local: SQLite e Room

conceito · slide_06

O SQLite é o banco de dados embutido em todos os dispositivos Android e iOS. O Room (Android) e o Core Data (iOS) são camadas de abstração que simplificam sua utilização.

Task.kt · Room · @Entity ▶ Kotlin
@Entity(tableName = "tasks")
data class Task(
    @PrimaryKey(autoGenerate = true) val id: Int = 0,
    val titulo: String,
    val concluida: Boolean = false,
    val pendingSync: Boolean = false
)

Sincronização de Dados Off-line com o Servidor

conceito · slide_07
  • Tarefas em segundo plano · WorkManager (Android) e BackgroundTasks (iOS) executam sincronização mesmo com o app fechado.
  • Fila de sincronização · operações off-line ficam na fila com pendingSync = true e são processadas sequencialmente ao reconectar.
SyncWorker.kt · WorkManager ▶ Kotlin
val constraints = Constraints.Builder()
    .setRequiredNetworkType(NetworkType.CONNECTED)
    .build()
val req = OneTimeWorkRequestBuilder<SyncWorker>()
    .setConstraints(constraints).build()
WorkManager.getInstance(context).enqueue(req)

Caderno — Definições da Aula

caderno · slide_08
  • Memória Volátil (RAM) · dados temporários que não persistem ao encerrar o app
  • SharedPreferences / UserDefaults · armazenamento de pares chave-valor para configurações simples
  • Arquivos Locais · dados não estruturados (imagens, PDFs, JSON) salvos no sistema de arquivos
  • SQLite · banco de dados relacional embutido em dispositivos Android e iOS
  • Room · biblioteca Android que abstrai o SQLite via anotações Kotlin (@Entity, @Dao)
  • Core Data · framework iOS para persistência de objetos com contexto gerenciado
  • pendingSync · campo booleano que marca registros criados off-line para sincronização posterior
  • WorkManager · API Android para tarefas em segundo plano com restrições de rede

{ } Ser Sempre + · Aplicação Conceitual

aplicacao_conceitual · slide_09

Você está em um projeto de app de lista de tarefas com armazenamento local e sincronização com servidor. Durante os testes finais, tarefas criadas off-line não estão sendo sincronizadas corretamente quando a conexão é restabelecida.

A equipe está dividida: alguns querem lançar assim; outros, incluindo você, percebem que o problema afeta usuários em áreas com cobertura limitada.

Sua tarefa: argumentar com a equipe sobre a importância de corrigir o problema, propor uma solução técnica (WorkManager / BackgroundTasks) e sugerir como resolver sem atrasar o lançamento.

Atividade Avaliativa

atividade · slide_10

Com base no cenário do app de tarefas off-line, produza uma resposta escrita contemplando os três pontos abaixo:

⌨ obrigatório incluir

Argumento técnico para corrigir o bug de sincronização antes do lançamento — com perspectiva do usuário e exemplos concretos.

Proposta de solução com WorkManager (Android) ou BackgroundTasks (iOS) explicando como resolve o problema.

Estratégia para conciliar a correção com o prazo de lançamento — gestão de conflito na equipe.

✓ critérios de avaliação

Correção técnica da solução proposta.

Clareza e coerência da argumentação.

Capacidade de articular solução técnica com raciocínio colaborativo.

⌨ entrega · enviar no AVA até o prazo da aula · formato: texto dissertativo, mínimo 15 linhas

Então Ficamos Assim…

sintese · slide_11
>_

Tipos de Armazenamento

RAM, SharedPreferences, Arquivos e Banco de Dados Local respondem a requisitos distintos de durabilidade e estrutura.

{ }

Banco de Dados Local

SQLite/Room (Android) e Core Data (iOS) são a escolha correta para dados relacionais, consultas e operações off-line.

Sincronização Off-line

Fila de sync + WorkManager/BackgroundTasks garante que dados criados sem conexão sejam enviados ao servidor quando a rede retornar.

← aula anterior

Introdução ao desenvolvimento mobile · Componentes de UI e ciclo de vida da aplicação

→ próxima aula

Implementação de banco de dados · Operações CRUD com Room e consultas SQL no contexto mobile

📘 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.