Capítulo 04 - Persistência de dados com SQLite

10,081 views

Published on

Neste capítulo apresentamos estratégias para persistência de dados no Android.
Itens discutidos:
1. Arquitetura MVC Mobile
2. Implementação do padrão de projeto View Helper
3. O Padrão de Projetos DAO e a classe SQLiteOpenHelper
4. Controle de versões de banco de dados
5. Mapeamento Objeto Relacional em Android

Published in: Technology
1 Comment
14 Likes
Statistics
Notes
No Downloads
Views
Total views
10,081
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
1,044
Comments
1
Likes
14
Embeds 0
No embeds

No notes for slide

Capítulo 04 - Persistência de dados com SQLite

  1. 1. Capítulo 04: Persistência com SQLite
  2. 2. Instrutor ● Programador desde 2000 ● Aluno de doutorado ● ● ● ● Mestre em informática pelo ICOMP/UFAM Especialista em aplicações WEB – FUCAPI marcio.palheta@gmail.com sites.google.com/site/marcio palheta M.Sc. Márcio Palheta
  3. 3. Agenda ● MVC em Android ● Criação da camada de modelo - entidade Aluno ● Padrão de Projeto – View Helper ● Padrão de Projeto – Data Access Object (DAO) ● CRUD (Create, Read, Update, Delete) M.Sc. Márcio Palheta 3/90
  4. 4. Model View Controller - MVC Activities (.java) CONTROLLER VIEW Layouts (.xml) MODEL DAO(.java) Entidades(.java) M.Sc. Márcio Palheta 4/90
  5. 5. Model View Controller - MVC Activities (.java) Evento CONTROLLER Chamada de metodo() modelo.getEstado() VIEW Layouts (.xml) MODEL DAO(.java) Entidades(.java) M.Sc. Márcio Palheta 5/90
  6. 6. Model View Controller - MVC Activities (.java) Evento CONTROLLER Chamada de metodo() modelo.getEstado() VIEW Layouts (.xml) MODEL SQLite DAO(.java) Entidades(.java) M.Sc. Márcio Palheta 6/90
  7. 7. Model View Controller - MVC Activities (.java) Evento CONTROLLER Chamada de metodo() Exibir tela modelo.getEstado() VIEW Layouts (.xml) MODEL SQLite DAO(.java) Entidades(.java) M.Sc. Márcio Palheta 7/90
  8. 8. Model View Controller - MVC Activities (.java) Evento Entrada de dados CONTROLLER Chamada de metodo() Exibir tela modelo.getEstado() VIEW Layouts (.xml) MODEL SQLite DAO(.java) Entidades(.java) M.Sc. Márcio Palheta 8/90
  9. 9. Model View Controller - MVC Activities (.java) Evento Entrada de dados CONTROLLER Chamada de metodo() modelo.atualizarEstado() Exibir tela modelo.getEstado() VIEW Layouts (.xml) MODEL SQLite DAO(.java) Entidades(.java) M.Sc. Márcio Palheta 9/90
  10. 10. Model View Controller - MVC Activities (.java) Evento Entrada de dados CONTROLLER Chamada de metodo() modelo.atualizarEstado() Exibir tela modelo.getEstado() MODEL VIEW Layouts (.xml) Notificação de mudanças SQLite DAO(.java) Entidades(.java) M.Sc. Márcio Palheta 10/90
  11. 11. Model View Controller - MVC Activities (.java) Evento Entrada de dados Exibir tela CONTROLLER tela.atualizarVisao() Chamada de metodo() modelo.atualizarEstado() modelo.getEstado() MODEL VIEW Layouts (.xml) Notificação de mudanças SQLite DAO(.java) Entidades(.java) M.Sc. Márcio Palheta 11/90
  12. 12. Persistência com SQLite ● ● A tela de Listagem da nossa App permite o cadastro do nome dos alunos e os exibe em uma ListView Contudo, temos alguns problemas nessa abordagem: – – ● Os dados são perdidos quando a App é destruída Precisamos de outros dados para o Aluno Como resposta, poderíamos: – Persistir os dados em um Bando de Dados – Usar a tela de Formulário para cadastro e alteração de dados do Aluno M.Sc. Márcio Palheta 12/90
  13. 13. Exercício 01: Crie o JavaBean Aluno M.Sc. Márcio Palheta 13/90
  14. 14. Exercício 01: implemente o bean Aluno M.Sc. Márcio Palheta 14/90
  15. 15. Pensando na arquitetura do sistema ● Agora, no método onCreate() da nossa Activity, precisamos povoar um objeto Aluno com dados da tela: M.Sc. Márcio Palheta 15/90
  16. 16. Pensando na arquitetura do sistema ● Agora, no método onCreate() da nossa Activity, Associa campos da tela precisamos povoar um objeto Aluno com A referências de controle dados da tela: M.Sc. Márcio Palheta 16/90
  17. 17. Pensando na arquitetura do sistema ● Agora, no método onCreate() da nossa Activity, da tela precisamos povoar um objeto Aluno comAssocia camposcontrole dados da tela: A referências de Criação de um objeto Aluno M.Sc. Márcio Palheta 17/90
  18. 18. Pensando na arquitetura do sistema ● Agora, no método onCreate() da nossa Activity, da tela precisamos povoar um objeto Aluno comAssocia camposcontrole dados da tela: A referências de Criação de um objeto Aluno Povoar o novo Aluno com dados vindos da tela M.Sc. Márcio Palheta 18/90
  19. 19. Pensando na arquitetura do sistema ● ● ● ● A complexidade da Activity aumenta, à medida que novas funcionalidades forem implementadas É uma boa prática de programação isolarmos pequenas responsabilidades em outras classes Assim, a Activity passa a realizar o seu trabalho interagindo com pequenos especialistas Neste cenário, podemos implementar o padrão de projeto View Helper, que define a criação de classes especialistas em extrair e tratar dados das telas M.Sc. Márcio Palheta 19/90
  20. 20. Exercício 02: A classe Helper M.Sc. Márcio Palheta 20/90
  21. 21. Exercício 02: A classe Helper Novo pacote para guardar nossos Helpers M.Sc. Márcio Palheta 21/90
  22. 22. Exercício 02: A classe Helper Novo pacote para guardar nossos Helpers Clase Helper para o nosso formulário M.Sc. Márcio Palheta 22/90
  23. 23. Exercício 02: A classe Helper Novo pacote para guardar nossos Helpers Clase Helper para o nosso formulário Atributos que representam componentes de tela M.Sc. Márcio Palheta 23/90
  24. 24. Exercício 02: A classe Helper Novo pacote para guardar nossos Helpers Clase Helper para o nosso formulário Atributos que representam componentes de tela Atributo que que armazena a referência a um Aluno M.Sc. Márcio Palheta 24/90
  25. 25. Exercício 02: A classe Helper (continuação) ● Método construtor que recebe um FormularioActivity M.Sc. Márcio Palheta 25/90
  26. 26. Exercício 02: A classe Helper construtor recebe um (continuação) O FormularioActivity ● Método construtor que recebe um FormularioActivity M.Sc. Márcio Palheta 26/90
  27. 27. Exercício 02: A classe Helper construtor recebe um (continuação) O Associa atributos do helper ● a Método construtor componentes de tela FormularioActivity que recebe um FormularioActivity M.Sc. Márcio Palheta 27/90
  28. 28. Exercício 02: A classe Helper construtor recebe um (continuação) O Associa atributos do helper ● a Método construtor componentes de tela FormularioActivity que recebe um FormularioActivity Criação do objeto Aluno M.Sc. Márcio Palheta 28/90
  29. 29. Exercício 02: A classe Helper ( Final ) M.Sc. Márcio Palheta 29/90
  30. 30. Exercício 02: A classe Helper ( Final ) Método que retorna Aluno com dados vindos da Tela M.Sc. Márcio Palheta 30/90
  31. 31. Exercício 02: A classe Helper ( Final ) Método que retorna Aluno com dados vindos da Tela Seta os atributos do Aluno com campos da Tela M.Sc. Márcio Palheta 31/90
  32. 32. Exercício 02: A classe Helper ( Final ) Método que retorna Aluno com dados vindos da Tela Seta os atributos do Aluno com campos da Tela Retorna uma referência para um objeto Aluno M.Sc. Márcio Palheta 32/90
  33. 33. Usando o Helper ● Agora que nossa classe FormularioHelper está pronta, podemos utilizá-la na nossa classe de controle FormularioActivity ● Para isso, vamos criar um atributo FormularioHelper ● Criar um objeto Helper no método onCreate() ● ● Utilizar os dados do Aluno em qualquer método que necessite desse objeto (reuso) Em nosso exemplo, usaremos o click do botão para exibir o nome do aluno M.Sc. Márcio Palheta 33/90
  34. 34. Exercício 03: Usando o Helper na View M.Sc. Márcio Palheta 34/90
  35. 35. Exercício 03: Usando o Helper na View Definição do novo atributo FormularioHelper M.Sc. Márcio Palheta 35/90
  36. 36. Exercício 03: Usando o Helper na View Definição do novo atributo FormularioHelper Inicialização do helper, passando uma referência para o objeto atual(this) M.Sc. Márcio Palheta 36/90
  37. 37. Exercício 03: Usando o Helper na View Definição do novo atributo FormularioHelper Inicialização do helper, passando uma referência para o objeto atual(this) Pedindo do Helper uma referência a Aluno M.Sc. Márcio Palheta 37/90
  38. 38. Exercício 03: Usando o Helper na View Definição do novo atributo FormularioHelper Inicialização do helper, passando uma referência para o objeto atual(this) Pedindo do Helper uma referência a Aluno Usando o novo objeto Aluno M.Sc. Márcio Palheta 38/90
  39. 39. Chegou a hora da persistência ● O ViewHelper extrai os dados de Aluno da tela ● Vamos armazenar esses dados em um Banco de Dados ● O Android vem com o banco relacional SQLite ● ● ● Para converter Objetos Java em Relações do banco de dados, vamos utilizar o padrão de projeto DAO DAO (Data Access Object) define que, para cada tabela do banco, criamos uma classe de perssitência Ex: para a tabela Aluno, teremos uma classe AlunoDAO, responsável pelo CRUD do aluno M.Sc. Márcio Palheta 39/90
  40. 40. Exercício 04: Classe AlunoDAO ● Crie a classe para persistir dados do Aluno: M.Sc. Márcio Palheta 40/90
  41. 41. Exercício 04: Classe AlunoDAO ● Novo pacote para classes de persistência Crie a classe para persistir dados do Aluno: M.Sc. Márcio Palheta 41/90
  42. 42. Exercício 04: Classe AlunoDAO ● Novo pacote para classes de persistência Crie a classe para persistir dados do Aluno: Classe DAO para persistir dados de Alunos M.Sc. Márcio Palheta 42/90
  43. 43. Exercício 04: Classe AlunoDAO ● Novo pacote para classes de persistência Crie a classe para persistir dados do Aluno: Classe DAO para persistir dados de Alunos Filha da classe de persistência SQLiteOpenHelper M.Sc. Márcio Palheta 43/90
  44. 44. Mas nem tudo são flores ● ● ● ● Até o momento da elaboração deste treinamento, não havia um framework estável para tratar o Mapeamento Objeto Relacional (vulgo MOR) em Android Dito isto, só nos resta fazer o controle manual das versões do nosso Banco de Dados Vamos atualizar nossa classe AlunoDAO para inclusão de algumas constantes necessárias ao nosso controle de versões Em seguida, vamos começar a usar as constantes no construtor da classe AlunoDAO M.Sc. Márcio Palheta 44/90
  45. 45. Exercício 05: Controle de versão do BD M.Sc. Márcio Palheta 45/90
  46. 46. Exercício 05: Controle de versão do para Novas constantes BD controle manual de versão do BD M.Sc. Márcio Palheta 46/90
  47. 47. Exercício 05: Controle de versão do para Novas constantes BD controle manual de versão do BD Registro da TAG de log padrão da nossa APP M.Sc. Márcio Palheta 47/90
  48. 48. Exercício 05: Controle de versão do para Novas constantes BD controle manual de versão do BD Registro da TAG de log padrão da nossa APP Método construtor que recebe apenas o Contexto M.Sc. Márcio Palheta 48/90
  49. 49. Exercício 05: Controle de versão do para Novas constantes BD controle manual de versão do BD Registro da TAG de log padrão da nossa APP Método construtor que recebe apenas o Contexto Chamada ao construtor da classe pai M.Sc. Márcio Palheta 49/90
  50. 50. Criação e atualização do BD ● ● ● ● Uma vez que o nosso controle de versão ocorre de forma manual, precisamos de métodos para criar e atualizar a estrutura das tabelas do nosso BD O método onCreate(SQLiteDatabase database) é invocado sempre que uma tabela não existir na base. Já o método onUpgrade(SQLiteDatabase database, int versaoAntiga, int versaoNova) é chamado quando precisamos atualizar a estrutura das tabelas Na nossa App, usaremos o OnUpgrade() para apagar e reconstruir a base M.Sc. Márcio Palheta 50/90
  51. 51. Exercício 06: Criação de tabelas ● Na classe AlunoDAO, crie o método onCreate(): M.Sc. Márcio Palheta 51/90
  52. 52. Exercício 06: Criação de tabelas ● Na classe AlunoDAO, crie o método onCreate(): Definição do comando que será executado M.Sc. Márcio Palheta 52/90
  53. 53. Exercício 06: Criação de tabelas ● Na classe AlunoDAO, crie o método onCreate(): Definição do comando que será executado Execução da atualização do banco de dados M.Sc. Márcio Palheta 53/90
  54. 54. Exercício 07: Atualização de tabelas ● Na classe AlunoDAO, crie o método onUpdate(): M.Sc. Márcio Palheta 54/90
  55. 55. Exercício 07: Atualização de tabelas ● Na classe AlunoDAO, crie o método onUpdate(): M.Sc. Márcio Palheta 55/90
  56. 56. Exercício 08: AlunoDAO.cadastrar() M.Sc. Márcio Palheta 56/90
  57. 57. Método que recebe um objeto Aluno e salva seus dados no BD Exercício 08: AlunoDAO.cadastrar() M.Sc. Márcio Palheta 57/90
  58. 58. Método que recebe um objeto Aluno e salva seus dados no BD Objeto que guarda os Exercícioserão usados valores que 08: AlunoDAO.cadastrar() para salvar no BD M.Sc. Márcio Palheta 58/90
  59. 59. Método que recebe um objeto Aluno e salva seus dados no BD Objeto que guarda os Exercícioserão usados valores que 08: AlunoDAO.cadastrar() para salvar no BD Povoando o mapa de valores com [chave:valor] M.Sc. Márcio Palheta 59/90
  60. 60. Método que recebe um objeto Aluno e salva seus dados no BD Objeto que guarda os Exercícioserão usados valores que 08: AlunoDAO.cadastrar() para salvar no BD Povoando o mapa de valores com [chave:valor] Armazena os dados do Aluno no banco M.Sc. Márcio Palheta 60/90
  61. 61. Atualização da FormularioActivity ● ● Agora que nossa camada de modelo está prepara para o cadastro do aluno, podemos atualizar nossa tela de formulário; No click do botão de Salvar, vamos: – Pedir um objeto Aluno do Helper; – Abrir uma conexão com BD, criando AlunoDAO; – Cadastrar o novo Aluno no BD; e – Fechar a conexão com o banco de dados M.Sc. Márcio Palheta 61/90
  62. 62. Exercício 09: Botão salvar M.Sc. Márcio Palheta 62/90
  63. 63. Exercício 09: Botão salvar M.Sc. Márcio Palheta 63/90
  64. 64. Queremos ver o que foi salvo ● ● ● ● Para visualizar os dados do banco de dados, precisamos atualizar as camadas de visão, controle e modelo Na camada de modelo, vamos criar o método listar() Vamos remover o EditText e Button das camadas de visão e controle Na camada de controle, precisamos alterar o método onCreate() da ListaAlunosActivity para chamar o método listar() da camada de modelo e apagar os métodos: – onSaveInstanceState() e onRestoreInstanceState() M.Sc. Márcio Palheta 64/90
  65. 65. Exercício 10: método AlunoDAO.listar() ● Início do método para recuperar Alunos do BD M.Sc. Márcio Palheta 65/90
  66. 66. Exercício 10: método AlunoDAO.listar() ● Início do método para recuperar Alunos do BD Instrução SQL para buscar todos os Alunos M.Sc. Márcio Palheta 66/90
  67. 67. Exercício 10: método AlunoDAO.listar() ● Início do método para recuperar Alunos do BD Instrução SQL para buscar todos os Alunos O Android recupera os registros do SQLite em um Cursor M.Sc. Márcio Palheta 67/90
  68. 68. Exercício 10: método AlunoDAO.listar() ● Início do método para recuperar Alunos do BD Instrução SQL para buscar todos os Alunos O Android recupera os registros do SQLite em um Cursor Vetor de parâmetros da consulta SQL M.Sc. Márcio Palheta 68/90
  69. 69. Exercício 10: final do método listar() M.Sc. Márcio Palheta 69/90
  70. 70. Percorre todos os registros do Cursor Exercício 10: final do método listar() M.Sc. Márcio Palheta 70/90
  71. 71. Percorre todos os registros do Cursor Exercício 10: final do método listar() Carrega o objeto Aluno com campos do Cursor M.Sc. Márcio Palheta 71/90
  72. 72. Percorre todos os registros do Cursor Exercício 10: final do método listar() Carrega o objeto Aluno com campos do Cursor Adiciona o Aluno à coleção de resposta M.Sc. Márcio Palheta 72/90
  73. 73. Percorre todos os registros do Cursor Exercício 10: final do método listar() Carrega o objeto Aluno com campos do Cursor Adiciona o Aluno à coleção de resposta android.database.SQLException É filha de RuntimeException M.Sc. Márcio Palheta 73/90
  74. 74. Percorre todos os registros do Cursor Exercício 10: final do método listar() Carrega o objeto Aluno com campos do Cursor Adiciona o Aluno à coleção de resposta android.database.SQLException É filha de RuntimeException Garante o fechamento da conexão com BD M.Sc. Márcio Palheta 74/90
  75. 75. Exercício 11: Crie Aluno.toString() M.Sc. Márcio Palheta 75/90
  76. 76. Exercício 12: Atualização da Tela inicial ● Altere o arquivo: /res/layout/listaalunoslayout.xml ● Deixe apenas a ListView M.Sc. Márcio Palheta 76/90
  77. 77. Exercício 13: camada de controle ● No método onCreate() da ListaAlunosActivity, deixe apenas a associação da ListView M.Sc. Márcio Palheta 77/90
  78. 78. Exercício 13: camada de controle ● No método onCreate() da ListaAlunosActivity, deixe apenas a associação da ListView Vamos manter a associação entre view e controller M.Sc. Márcio Palheta 78/90
  79. 79. Exercício 13: camada de controle ● No método onCreate() da ListaAlunosActivity, deixe apenas a associação da ListView Vamos manter a associação entre view e controller O código para carga da coleção de alunos ficará em outro método M.Sc. Márcio Palheta 79/90
  80. 80. Exercício 14: Mudança de tipos ● ● Nossa coleção de Alunos deve deixar de ser List<String> e se tornar List<Aluno> Altere, também, o tipo do ArrayAdapter M.Sc. Márcio Palheta 80/90
  81. 81. Exercício 14: Mudança de tipos ● ● Nossa coleção de Alunos deve deixar de ser List<String> e se tornar List<Aluno> Altere, também, o tipo do ArrayAdapter M.Sc. Márcio Palheta 81/90
  82. 82. Exercício 15: carga dos dados ● Na ListaAlunosActivity, crie o método carregarLista() para acesso ao DAO e carga da coleção de Alunos M.Sc. Márcio Palheta 82/90
  83. 83. Exercício 15: carga dos dados ● Na ListaAlunosActivity, crie o método carregarLista() para Novo método para acesso ao DAO e carga da coleção de Alunos carga da coleção de alunos M.Sc. Márcio Palheta 83/90
  84. 84. Exercício 15: carga dos dados ● Na ListaAlunosActivity, crie o método carregarLista() para Novo método para acesso ao DAO e carga da coleção de Alunos carga da coleção de alunos Acesso à camada de modelo M.Sc. Márcio Palheta 84/90
  85. 85. Exercício 15: carga dos dados ● Na ListaAlunosActivity, crie o método carregarLista() para Novo método para acesso ao DAO e carga da coleção de Alunos carga da coleção de alunos Acesso à camada de modelo Atualização da tela M.Sc. Márcio Palheta 85/90
  86. 86. Exercício 16: Carga no onResume() ● ● Na classe ListaAlunosActivity, vamos cria o método onResume() Nesse método, vamos fazer a chamada a carregarLista() M.Sc. Márcio Palheta 86/90
  87. 87. Execute a nossa App M.Sc. Márcio Palheta 87/90
  88. 88. O que vem a seguir? ● Complemento do cadastro - exclusão (ContextMenu) ● Compartilhar informações entre Activities – Intents ● Intent implicita – Chamada telefônica para um aluno ● Envio e Recebimento de SMS ● Navegar em site do Aluno e Envio de email ● Câmera e arquivos ● LayoutInflater ● Serviços de background ● Integração via JSON M.Sc. Márcio Palheta 88/90
  89. 89. Referências ● www.caelum.com.br ● d.android.com ● ● LECHETA, Ricardo. Google Android, 3a edição, Novatec, São Paulo, 2013 Código fonte completo: https://github.com/marciopalheta/cursosandroid M.Sc. Márcio Palheta 89/90
  90. 90. Capítulo 04: Persistência com SQLite

×