Sandro Rigo [email protected] Desenvolvimento de Aplicações Móveis http://www.ic.unicamp.br/~sandro 1 Introdução • Alguns dados precisam ser persistidos – Contatos, preferências, bookmarks, etc ... • Armazenamento local ou nuvem? – Acesso rápido – Acesso offline • Usar como uma cache • Vamos usar um banco de dados SQLite • Referência: Learning Android, Cap 9. Desenvolvimento de Aplicações Móveis http://www.ic.unicamp.br/~sandro 2 SQLite • Não exige configuração • Conjunto de bibliotecas – Não tem servidor rodando • O banco fica em um único arquivo – Passa preocupações de segurança para o sistema de arquivos – Android tem um sandbox para cada aplicação • É open-source Desenvolvimento de Aplicações Móveis http://www.ic.unicamp.br/~sandro 3 SQLite • É possível usar outras soluções – JavaDB, MongoDB – Você teria que empacotar as bibliotecas necessárias com sua aplicação • Interface Android – DbHelper – App usa-a para interagir com o banco Desenvolvimento de Aplicações Móveis http://www.ic.unicamp.br/~sandro 4 Aplicação em nosso exemplo • Armazenar localmente as atualizações de status • Permitirá à aplicação mostrar as atualizações mais rapidamente – Independente da rede • Teremos um serviço rodando em background – Atualizar o BD periodicamente • Isto melhorará a experiência do usuário Desenvolvimento de Aplicações Móveis http://www.ic.unicamp.br/~sandro 5 Principais pontos • Conexão com o banco – Usaremos a classe SQLiteOpenHelper – Retorna uma instância de SQLiteDatabase • Esquema – Cada linha da tabela conterá os dados de um post – Colunas: ID, created_at, txt, user – Deve ser criado quando a aplicação inicia • Método onCreate() de DbHelper – Deve ter um número de versão – Método onUpgrade() • Usado quando o esquema muda • Nosso exemplo vai descartar a tabela Desenvolvimento de Aplicações Móveis http://www.ic.unicamp.br/~sandro 6 Quatro Operações Principais • DbHelper oferece: – Insert(), query(), update(), delete() -> CRUD • Por quê não usar SQL diretamente? – Segurança: • Sentenças SQL tomam entrada do usuário • SQL injection attack – Desempenho: • Executar sentenças SQL repetidamente é custoso -> parser da sentença – Confiabilidade: • Métodos DbHelper são mais robustos • Erros SQL aparecem em tempo de execução Desenvolvimento de Aplicações Móveis http://www.ic.unicamp.br/~sandro 7 Cursores • Uma consulta retorna um conjunto de linhas e um cursor • Você recupera os resultados, um por vez, a partir do cursor • Você pode mover o cursor pelo conjunto Desenvolvimento de Aplicações Móveis http://www.ic.unicamp.br/~sandro 8 Dica • Tudo que você faz com SQL pode gera uma exceção SQL – Você está interagindo com um sistema fora de seu controle direto, o banco • É importante você tratar as SQLExceptions – Envolva todas as chamadas a banco em estruturas try/catch – Nem que seja para simpleste logar através de Log.e() Desenvolvimento de Aplicações Móveis http://www.ic.unicamp.br/~sandro 9 Nosso exemplo ... • Estenda a classe SQLiteOpenHelper • Implemente – Construtor – onCreate() – onUpgrade() • Altere o serviço UpdateService para armazenar os dados no BD Desenvolvimento de Aplicações Móveis http://www.ic.unicamp.br/~sandro 10 Testando • Verifique se o BD foi criado – Ele ficará em /data/data/sua_app/databases/timeline.db – Use o DDMS File Explorer ou adb shell • Sqlite3 – Instalado no Android – Use adb shell – Vá à pasta correta e execute sqlite3 – Você pode fazer verificar o schema, tabelas e fazer um dump do banco • Use o LogCat para identificar eventuais exceções Desenvolvimento de Aplicações Móveis http://www.ic.unicamp.br/~sandro 11