Instrutor
● Programador desde 2000
● Aluno de doutorado
● Mestre em informática pelo
ICOMP/UFAM
● Especialista em aplicações
WEB – FUCAPI
M.Sc. Márcio Palheta
3/90
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)
Model View Controller - MVC
MODEL CONTROLLER
Activities (.java)
M.Sc. Márcio Palheta
5/90
Model View Controller - MVC
Model View Controller - MVC
MODEL SQLite
VIEW
CONTROLLER Activities (.java)
Chamada de metodo() Evento
M.Sc. Márcio Palheta
7/90
Model View Controller - MVC
M.Sc. Márcio Palheta
9/90
Model View Controller - MVC
M.Sc. Márcio Palheta
11/90
Model View Controller - MVC
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
M.Sc. Márcio Palheta
13/90
M.Sc. Márcio Palheta
15/90
Pensando na arquitetura do sistema
● Agora, no método onCreate() da nossa Activity,
Pensando na arquitetura do sistema
● Agora, no método onCreate() da nossa Activity,
M.Sc. Márcio Palheta
17/90
Pensando na arquitetura do sistema
● Agora, no método onCreate() da nossa Activity,
precisamos povoar um objeto Aluno com dados da tela:Associa campos da tela A referências de controle
Criação de um objeto Aluno
Pensando na arquitetura do sistema
● Agora, no método onCreate() da nossa Activity,
precisamos povoar um objeto Aluno com dados da tela:Associa campos da tela A referências de controle
Criação de um objeto Aluno
M.Sc. Márcio Palheta
19/90
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
M.Sc. Márcio Palheta
21/90
Exercício 02: A classe Helper
Novo pacotenossos Helpers para guardarM.Sc. Márcio Palheta
23/90
Exercício 02: A classe Helper
Atributos que representam componentes de tela Novo pacote para guardar
nossos Helpers
Exercício 02: A classe Helper
Atributos que representam componentes de tela
Atributo que que armazena a referência a um Aluno Novo pacote para guardar
nossos Helpers
M.Sc. Márcio Palheta
25/90
Exercício 02: A classe Helper
(continuação)Exercício 02: A classe Helper
(continuação)● Método construtor que recebe um FormularioActivity
O construtor recebe um
M.Sc. Márcio Palheta
27/90
Exercício 02: A classe Helper
(continuação)● Método construtor que recebe um FormularioActivity
O construtor recebe um
FormularioActivity
Exercício 02: A classe Helper
(continuação)● Método construtor que recebe um FormularioActivity
O construtor recebe um
FormularioActivity
Associa atributos do helper a componentes de tela
M.Sc. Márcio Palheta
29/90
Exercício 02: A classe Helper
( Final )Método que retorna Aluno
M.Sc. Márcio Palheta
31/90
Exercício 02: A classe Helper
( Final )Método que retorna Aluno
com dados vindos da Tela
Seta os atributos do Aluno
Exercício 02: A classe Helper
( Final )Método que retorna Aluno
com dados vindos da Tela
Seta os atributos do Aluno
M.Sc. Márcio Palheta
33/90
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
M.Sc. Márcio Palheta
35/90
Exercício 03: Usando o Helper na View
Definição do novo FormularioHelperatributoInicialização do helper, passando uma referência
M.Sc. Márcio Palheta
37/90
Exercício 03: Usando o Helper na View
Definição do novo FormularioHelperatributoInicialização do helper, passando uma referência
para o objeto atual(this)
Exercício 03: Usando o Helper na View
Definição do novo FormularioHelperatributoInicialização do helper, passando uma referência
para o objeto atual(this)
M.Sc. Márcio Palheta
39/90
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,
Exercício 04: Classe AlunoDAO
M.Sc. Márcio Palheta
41/90
Exercício 04: Classe AlunoDAO
● Crie a classe para persistir dados do Aluno:
Exercício 04: Classe AlunoDAO
● Crie a classe para persistir dados do Aluno:
Novo pacote para classes de persistência
Classe DAO para persistir dados de
M.Sc. Márcio Palheta
43/90
Exercício 04: Classe AlunoDAO
● Crie a classe para persistir dados do Aluno:
Novo pacote para classes de persistência
Classe DAO para persistir dados de
Alunos
Filha da classe de persistência
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
M.Sc. Márcio Palheta
45/90
Exercício 05: Controle de versão do BD
Novas constantes paracontrole manual de
M.Sc. Márcio Palheta
47/90
Exercício 05: Controle de versão do BD
Novas constantes paracontrole manual de
versão do BD
Exercício 05: Controle de versão do BD
Novas constantes paracontrole manual de
versão do BD
Registro da TAG de log padrão da nossa APP
M.Sc. Márcio Palheta
49/90
Exercício 05: Controle de versão do BD
Novas constantes paracontrole 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
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
M.Sc. Márcio Palheta
51/90
Exercício 06: Criação de tabelas
Exercício 06: Criação de tabelas
● Na classe AlunoDAO, crie o método onCreate():
Definição do comando
M.Sc. Márcio Palheta
53/90
Exercício 06: Criação de tabelas
● Na classe AlunoDAO, crie o método onCreate():
Definição do comando
que será executado
Exercício 07: Atualização de tabelas
M.Sc. Márcio Palheta
55/90
Exercício 07: Atualização de tabelas
M.Sc. Márcio Palheta
57/90
Exercício 08: AlunoDAO.cadastrar()
Método que recebe um objeto Aluno e salva
Exercício 08: AlunoDAO.cadastrar()
Método que recebe um objeto Aluno e salva
seus dados no BD Objeto que guarda os
M.Sc. Márcio Palheta
59/90
Exercício 08: AlunoDAO.cadastrar()
Método que recebe um objeto Aluno e salva
seus dados no BD
Povoando o mapa de valores com [chave:valor] Objeto que guarda os
Exercício 08: AlunoDAO.cadastrar()
Método que recebe um objeto Aluno e salva
seus dados no BD
Povoando o mapa de valores com [chave:valor] Objeto que guarda os
valores que serão usados para salvar no BD
M.Sc. Márcio Palheta
61/90
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
M.Sc. Márcio Palheta
63/90
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:
M.Sc. Márcio Palheta
65/90
Exercício 10: método AlunoDAO.listar()
Exercício 10: método AlunoDAO.listar()
● Início do método para recuperar Alunos do BD
M.Sc. Márcio Palheta
67/90
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
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
69/90
M.Sc. Márcio Palheta
71/90
Exercício 10: final do método listar()
registrosPercorre do todos osCursorCarrega o objeto Aluno
Exercício 10: final do método listar()
registrosPercorre do todos osCursorCarrega o objeto Aluno
com campos do Cursor
M.Sc. Márcio Palheta
73/90
Exercício 10: final do método listar()
registrosPercorre do todos osCursorCarrega o objeto Aluno
com campos do Cursor
Adiciona o Aluno à coleção de resposta
android.database.SQLException
Exercício 10: final do método listar()
registrosPercorre do todos osCursorCarrega o objeto Aluno
com campos do Cursor
Adiciona o Aluno à coleção de resposta
android.database.SQLException
M.Sc. Márcio Palheta
75/90
Exercício 12: Atualização da Tela inicial
● Altere o arquivo: /res/layout/listaalunoslayout.xml
M.Sc. Márcio Palheta
77/90
Exercício 13: camada de controle
● No método onCreate() da ListaAlunosActivity, deixe
Exercício 13: camada de controle
● No método onCreate() da ListaAlunosActivity, deixe
apenas a associação da ListView
Vamos manter a
M.Sc. Márcio Palheta
79/90
Exercício 13: camada de controle
● No método onCreate() da ListaAlunosActivity, deixe
apenas a associação da ListView
O código para carga da coleção de alunos ficará em outro método
Vamos manter a
Exercício 14: Mudança de tipos
● Nossa coleção de Alunos deve deixar de ser List<String>
e se tornar List<Aluno>
M.Sc. Márcio Palheta
81/90
Exercício 14: Mudança de tipos
● Nossa coleção de Alunos deve deixar de ser List<String>
e se tornar List<Aluno>
Exercício 15: carga dos dados
● Na ListaAlunosActivity, crie o método carregarLista() para
M.Sc. Márcio Palheta
83/90
Exercício 15: carga dos dados
● Na ListaAlunosActivity, crie o método carregarLista() para
acesso ao DAO e carga da coleção de AlunosNovo método paracarga da coleção
Exercício 15: carga dos dados
● Na ListaAlunosActivity, crie o método carregarLista() para
acesso ao DAO e carga da coleção de Alunos
Acesso à camada de modelo
Novo método para carga da coleção
M.Sc. Márcio Palheta
85/90
Exercício 15: carga dos dados
● Na ListaAlunosActivity, crie o método carregarLista() para
acesso ao DAO e carga da coleção de Alunos
Acesso à camada de modelo
Novo método para carga da coleção
de alunos
Exercício 16: Carga no onResume()
● Na classe ListaAlunosActivity, vamos cria o método
onResume()
M.Sc. Márcio Palheta
87/90
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
M.Sc. Márcio Palheta
89/90
Referências
●
www.caelum.com.br
●
d.android.com
●
LECHETA, Ricardo. Google Android, 3a edição,
Novatec, São Paulo, 2013
●