Aula 08 - Persistência de Dados 💾
💾 Onde guardamos os dados?
Apps precisam lembrar das coisas quando fechados.
- Configurações simples.
- Listas complexas.
- Arquivos multimídia.
1. SharedPreferences 🔑
A forma mais simples: Chave e Valor.
- "nome" -> "Ricardo"
- "notificacoes_on" -> true
- "tema" -> 1
Usando PreferenceManager
val prefs = getSharedPreferences("config", MODE_PRIVATE)
// Gravar
prefs.edit().putString("USER", "Android").apply()
// Ler
val user = prefs.getString("USER", "Ninguém")
Atenção: Não use para dados grandes ou listas!
🏛️ Banco de Dados: SQLite
O Android tem o SQLite no seu coração.
- Banco Relacional.
- Leve e embutido.
- Mas... o código puro é horrível (SQL strings).
🔨 Conheça o ROOM
A biblioteca do Jetpack que salva vidas.
- Entity: Sua tabela (Classe de dados).
- DAO: Seus comandos (Queries).
- Database: O gerente do banco.
Passo 1: A Entidade (@Entity)
Passo 2: O DAO (@Dao)
@Dao
interface UserDao {
@Insert
void save(User user)
@Query("SELECT * FROM User")
LiveData<List<User>> getAll()
}
🧵 A Regra de Ouro do Banco
NUNCA acesse o banco na Main Thread.
- O Room vai travar seu app (Crash) se você tentar.
- Use Coroutines ou LiveData.
- Por que? Porque ler o disco é lento e trava a tela.
🧬 Ciclo Completo: MVVM + Room
graph TD
UI[Activity/View] -->|Observa| VM[ViewModel]
VM -->|Pede| REPO[Repository]
REPO -->|Query| DB[(Room DB)]
DB -->|Retorna| REPO
REPO -->|State| VM
VM -->|LiveData| UI
📂 Arquivos Externos
Para fotos e vídeos.
- Cache: Temporário.
- Arquivos Privados: Só seu app vê.
- Arquivos Públicos: Galeria, Downloads (Precisa de permissão).
🆚 Persistência: Android vs iOS
| Recurso | Android | iOS |
|---|---|---|
| Simples | SharedPreferences | UserDefaults |
| Banco | Room (SQLite) | Core Data / SwiftData |
| Arquivos | Scoped Storage | Sandbox |
🕵️ Ferramenta: App Inspection
No Android Studio, você pode ver o banco de dados ao vivo.
- Rode o app.
- Aba
App Inspection->Database Inspector. - Você pode editar os dados e ver a tela do celular mudar! 🎩
🛠️ Prática: Lista de Tarefas
Vamos criar um banco para salvar textos.
- Configure o Room no
build.gradle. - Crie a Entity
Task. - Salve um texto vindo de um
EditText.
Dica: O Singleton do Banco
Não crie várias instâncias do banco. Use o padrão Singleton.
val db = Room.databaseBuilder(
applicationContext,
AppDatabase::class.java, "database-name"
).build()
🏁 Conclusão
- Escolha a ferramenta certa para o dado certo.
- Room é o padrão para dados estruturados.
- Sempre use threads de background (IO).