Você está na página 1de 90

Captulo 04: Persistncia com SQLite

Instrutor

Programador desde 2000


Aluno de doutorado
Mestre em informtica pelo
ICOMP/UFAM
Especialista em aplicaes
WEB FUCAPI
marcio.palheta@gmail.com
sites.google.com/site/marcio
palheta
M.Sc. Mrcio Palheta
Agenda

MVC em Android
Criao da camada de modelo - entidade Aluno
Padro de Projeto View Helper
Padro de Projeto Data Access Object (DAO)
CRUD (Create, Read, Update, Delete)

M.Sc. Mrcio Palheta


3/90
Model View Controller - MVC
Activities (.java)

CONTROLLER

VIEW MODEL

Layouts (.xml) DAO(.java)


Entidades(.java)

M.Sc. Mrcio Palheta


4/90
Model View Controller - MVC
Activities (.java)
Evento

CONTROLLER Chamada
de metodo()

modelo.getEstado()

VIEW MODEL

Layouts (.xml) DAO(.java)


Entidades(.java)

M.Sc. Mrcio Palheta


5/90
Model View Controller - MVC
Activities (.java)
Evento

CONTROLLER Chamada
de metodo()

modelo.getEstado()

VIEW MODEL SQLite

Layouts (.xml) DAO(.java)


Entidades(.java)

M.Sc. Mrcio Palheta


6/90
Model View Controller - MVC
Activities (.java)
Evento

CONTROLLER Chamada
de metodo()

Exibir tela

modelo.getEstado()

VIEW MODEL SQLite

Layouts (.xml) DAO(.java)


Entidades(.java)

M.Sc. Mrcio Palheta


7/90
Model View Controller - MVC
Activities (.java)
Evento
Entrada de
dados CONTROLLER Chamada
de metodo()

Exibir tela

modelo.getEstado()

VIEW MODEL SQLite

Layouts (.xml) DAO(.java)


Entidades(.java)

M.Sc. Mrcio Palheta


8/90
Model View Controller - MVC
Activities (.java)
Evento
Entrada de
dados CONTROLLER Chamada
de metodo()

Exibir tela modelo.atualizarEstado()

modelo.getEstado()

VIEW MODEL SQLite

Layouts (.xml) DAO(.java)


Entidades(.java)

M.Sc. Mrcio Palheta


9/90
Model View Controller - MVC
Activities (.java)
Evento
Entrada de
dados CONTROLLER Chamada
de metodo()

Exibir tela modelo.atualizarEstado()

modelo.getEstado()

VIEW MODEL SQLite


Notificao de
mudanas
Layouts (.xml) DAO(.java)
Entidades(.java)

M.Sc. Mrcio Palheta


10/90
Model View Controller - MVC
Activities (.java)
Evento
Entrada de
dados CONTROLLER Chamada
de metodo()

tela.atualizarVisao() modelo.atualizarEstado()
Exibir tela

modelo.getEstado()

VIEW MODEL SQLite


Notificao de
mudanas
Layouts (.xml) DAO(.java)
Entidades(.java)

M.Sc. Mrcio Palheta


11/90
Persistncia 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 so perdidos quando a App destruda
Precisamos de outros dados para o Aluno
Como resposta, poderamos:
Persistir os dados em um Bando de Dados
Usar a tela de Formulrio para cadastro e alterao de
dados do Aluno

M.Sc. Mrcio Palheta


12/90
Exerccio 01: Crie o JavaBean Aluno

M.Sc. Mrcio Palheta


13/90
Exerccio 01: implemente o bean Aluno

M.Sc. Mrcio Palheta


14/90
Pensando na arquitetura do sistema
Agora, no mtodo onCreate() da nossa Activity,
precisamos povoar um objeto Aluno com dados da tela:

M.Sc. Mrcio Palheta


15/90
Pensando na arquitetura do sistema
Agora, no mtodo onCreate() da nossa Activity,
precisamos povoar um objeto Aluno com AAssocia
dados campos
da da tela
tela:
referncias de controle

M.Sc. Mrcio Palheta


16/90
Pensando na arquitetura do sistema
Agora, no mtodo onCreate() da nossa Activity,
precisamos povoar um objeto Aluno comAAssocia
dados campos
da da tela
tela:
referncias de controle

Criao de um
objeto Aluno

M.Sc. Mrcio Palheta


17/90
Pensando na arquitetura do sistema
Agora, no mtodo onCreate() da nossa Activity,
precisamos povoar um objeto Aluno comAAssocia
dados campos
da da tela
tela:
referncias de controle

Criao de um
objeto Aluno
Povoar o novo Aluno com
dados vindos da tela

M.Sc. Mrcio Palheta


18/90
Pensando na arquitetura do sistema
A complexidade da Activity aumenta, medida que novas
funcionalidades forem implementadas
uma boa prtica de programao isolarmos pequenas
responsabilidades em outras classes
Assim, a Activity passa a realizar o seu trabalho
interagindo com pequenos especialistas
Neste cenrio, podemos implementar o padro de projeto
View Helper, que define a criao de classes especialistas
em extrair e tratar dados das telas

M.Sc. Mrcio Palheta


19/90
Exerccio 02: A classe Helper

M.Sc. Mrcio Palheta


20/90
Novo pacote para guardar
Exerccio 02: A classe Helper nossos Helpers

M.Sc. Mrcio Palheta


21/90
Novo pacote para guardar
Exerccio 02: A classe Helper nossos Helpers

Clase Helper para o nosso


formulrio

M.Sc. Mrcio Palheta


22/90
Novo pacote para guardar
Exerccio 02: A classe Helper nossos Helpers

Clase Helper para o nosso


formulrio

Atributos que representam


componentes de tela

M.Sc. Mrcio Palheta


23/90
Novo pacote para guardar
Exerccio 02: A classe Helper nossos Helpers

Clase Helper para o nosso


formulrio

Atributos que representam


componentes de tela

Atributo que que armazena


a referncia a um Aluno

M.Sc. Mrcio Palheta


24/90
Exerccio 02: A classe Helper (continuao)
Mtodo construtor que recebe um FormularioActivity

M.Sc. Mrcio Palheta


25/90
Exerccio 02: A classe HelperO construtor
(continuao)
recebe um
FormularioActivity

Mtodo construtor que recebe um FormularioActivity

M.Sc. Mrcio Palheta


26/90
Exerccio 02: A classe HelperO construtor
(continuao)
recebe um
FormularioActivity
Associa atributos do helper
a Mtodo
componentesconstrutor
de tela que recebe um FormularioActivity

M.Sc. Mrcio Palheta


27/90
Exerccio 02: A classe HelperO construtor
(continuao)
recebe um
FormularioActivity
Associa atributos do helper
a Mtodo
componentesconstrutor
de tela que recebe um FormularioActivity

Criao do
objeto Aluno

M.Sc. Mrcio Palheta


28/90
Exerccio 02: A classe Helper ( Final )

M.Sc. Mrcio Palheta


29/90
Exerccio 02: A classe Helper ( Final )

Mtodo que retorna Aluno


com dados vindos da Tela

M.Sc. Mrcio Palheta


30/90
Exerccio 02: A classe Helper ( Final )

Mtodo que retorna Aluno


com dados vindos da Tela
Seta os atributos do Aluno
com campos da Tela

M.Sc. Mrcio Palheta


31/90
Exerccio 02: A classe Helper ( Final )

Mtodo que retorna Aluno


com dados vindos da Tela
Seta os atributos do Aluno
com campos da Tela

Retorna uma referncia


para um objeto Aluno

M.Sc. Mrcio Palheta


32/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 mtodo onCreate()
Utilizar os dados do Aluno em qualquer mtodo que
necessite desse objeto (reuso)
Em nosso exemplo, usaremos o click do boto para exibir
o nome do aluno

M.Sc. Mrcio Palheta


33/90
Exerccio 03: Usando o Helper na View

M.Sc. Mrcio Palheta


34/90
Exerccio 03: Usando o Helper na View
Definio do novo atributo
FormularioHelper

M.Sc. Mrcio Palheta


35/90
Exerccio 03: Usando o Helper na View
Definio do novo atributo
FormularioHelper

Inicializao do helper,
passando uma referncia
para o objeto atual(this)

M.Sc. Mrcio Palheta


36/90
Exerccio 03: Usando o Helper na View Definio do novo atributo
FormularioHelper

Inicializao do helper,
passando uma referncia
para o objeto atual(this)

Pedindo do Helper
uma referncia a Aluno

M.Sc. Mrcio Palheta


37/90
Exerccio 03: Usando o Helper na View Definio do novo atributo
FormularioHelper

Inicializao do helper,
passando uma referncia
para o objeto atual(this)

Pedindo do Helper
uma referncia a Aluno

Usando o novo objeto


Aluno M.Sc. Mrcio Palheta
38/90
Chegou a hora da persistncia
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 Relaes do banco de
dados, vamos utilizar o padro de projeto DAO
DAO (Data Access Object) define que, para cada tabela
do banco, criamos uma classe de perssitncia
Ex: para a tabela Aluno, teremos uma classe AlunoDAO,
responsvel pelo CRUD do aluno

M.Sc. Mrcio Palheta


39/90
Exerccio 04: Classe AlunoDAO
Crie a classe para persistir dados do Aluno:

M.Sc. Mrcio Palheta


40/90
Exerccio 04: Classe AlunoDAO
Novo pacote para
classes de persistncia
Crie a classe para persistir dados do Aluno:

M.Sc. Mrcio Palheta


41/90
Exerccio 04: Classe AlunoDAO
Novo pacote para
classes de persistncia
Crie a classe para persistir dados do Aluno:

Classe DAO para


persistir dados de
Alunos

M.Sc. Mrcio Palheta


42/90
Exerccio 04: Classe AlunoDAO
Novo pacote para
classes de persistncia
Crie a classe para persistir dados do Aluno:

Classe DAO para Filha da classe de


persistir dados de persistncia
Alunos SQLiteOpenHelper

M.Sc. Mrcio Palheta


43/90
Mas nem tudo so flores
At o momento da elaborao deste treinamento, no
havia um framework estvel para tratar o Mapeamento
Objeto Relacional (vulgo MOR) em Android
Dito isto, s nos resta fazer o controle manual das verses
do nosso Banco de Dados
Vamos atualizar nossa classe AlunoDAO para incluso de
algumas constantes necessrias ao nosso controle de
verses
Em seguida, vamos comear a usar as constantes no
construtor da classe AlunoDAO

M.Sc. Mrcio Palheta


44/90
Exerccio 05: Controle de verso do BD

M.Sc. Mrcio Palheta


45/90
Exerccio 05: Controle de verso do para
Novas constantes BD
controle manual de
verso do BD

M.Sc. Mrcio Palheta


46/90
Exerccio 05: Controle de verso do para
Novas constantes BD
controle manual de
verso do BD

Registro da TAG de log


padro da nossa APP

M.Sc. Mrcio Palheta


47/90
Exerccio 05: Controle de verso do para
Novas constantes BD
controle manual de
verso do BD

Registro da TAG de log


padro da nossa APP

Mtodo construtor que


recebe apenas o Contexto

M.Sc. Mrcio Palheta


48/90
Exerccio 05: Controle de verso do para
Novas constantes BD
controle manual de
verso do BD

Registro da TAG de log


padro da nossa APP

Mtodo construtor que


recebe apenas o Contexto
Chamada ao construtor
da classe pai

M.Sc. Mrcio Palheta


49/90
Criao e atualizao do BD
Uma vez que o nosso controle de verso ocorre de forma
manual, precisamos de mtodos para criar e atualizar a
estrutura das tabelas do nosso BD
O mtodo onCreate(SQLiteDatabase database)
invocado sempre que uma tabela no existir na base.
J o mtodo 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. Mrcio Palheta


50/90
Exerccio 06: Criao de tabelas
Na classe AlunoDAO, crie o mtodo onCreate():

M.Sc. Mrcio Palheta


51/90
Exerccio 06: Criao de tabelas
Na classe AlunoDAO, crie o mtodo onCreate():
Definio do comando
que ser executado

M.Sc. Mrcio Palheta


52/90
Exerccio 06: Criao de tabelas
Na classe AlunoDAO, crie o mtodo onCreate():
Definio do comando
que ser executado

Execuo da atualizao
do banco de dados

M.Sc. Mrcio Palheta


53/90
Exerccio 07: Atualizao de tabelas

Na classe AlunoDAO, crie o mtodo onUpdate():

M.Sc. Mrcio Palheta


54/90
Exerccio 07: Atualizao de tabelas

Na classe AlunoDAO, crie o mtodo onUpdate():

M.Sc. Mrcio Palheta


55/90
Exerccio 08: AlunoDAO.cadastrar()

M.Sc. Mrcio Palheta


56/90
Mtodo que recebe um
Exerccio 08: AlunoDAO.cadastrar() objeto Aluno e salva
seus dados no BD

M.Sc. Mrcio Palheta


57/90
Mtodo que recebe um
Exerccio 08:usados
AlunoDAO.cadastrar()
Objeto que guarda os
valores que sero
objeto Aluno e salva
seus dados no BD
para salvar no BD

M.Sc. Mrcio Palheta


58/90
Mtodo que recebe um
Exerccio 08:usados
AlunoDAO.cadastrar()
Objeto que guarda os
valores que sero
objeto Aluno e salva
seus dados no BD
para salvar no BD

Povoando o mapa de
valores com [chave:valor]

M.Sc. Mrcio Palheta


59/90
Mtodo que recebe um
Exerccio 08:usados
AlunoDAO.cadastrar()
Objeto que guarda os
valores que sero
objeto Aluno e salva
seus dados no BD
para salvar no BD

Povoando o mapa de
valores com [chave:valor]

Armazena os dados
do Aluno no banco

M.Sc. Mrcio Palheta


60/90
Atualizao da FormularioActivity
Agora que nossa camada de modelo est prepara para o
cadastro do aluno, podemos atualizar nossa tela de
formulrio;
No click do boto de Salvar, vamos:
Pedir um objeto Aluno do Helper;
Abrir uma conexo com BD, criando AlunoDAO;
Cadastrar o novo Aluno no BD; e
Fechar a conexo com o banco de dados

M.Sc. Mrcio Palheta


61/90
Exerccio 09: Boto salvar

M.Sc. Mrcio Palheta


62/90
Exerccio 09: Boto salvar

M.Sc. Mrcio Palheta


63/90
Queremos ver o que foi salvo
Para visualizar os dados do banco de dados, precisamos
atualizar as camadas de viso, controle e modelo
Na camada de modelo, vamos criar o mtodo listar()
Vamos remover o EditText e Button das camadas de viso
e controle
Na camada de controle, precisamos alterar o mtodo
onCreate() da ListaAlunosActivity para chamar o mtodo
listar() da camada de modelo e apagar os mtodos:
onSaveInstanceState() e onRestoreInstanceState()

M.Sc. Mrcio Palheta


64/90
Exerccio 10: mtodo AlunoDAO.listar()
Incio do mtodo para recuperar Alunos do BD

M.Sc. Mrcio Palheta


65/90
Exerccio 10: mtodo AlunoDAO.listar()
Incio do mtodo para recuperar Alunos do BD
Instruo SQL para
buscar todos os Alunos

M.Sc. Mrcio Palheta


66/90
Exerccio 10: mtodo AlunoDAO.listar()
Incio do mtodo para recuperar Alunos do BD
Instruo SQL para
buscar todos os Alunos

O Android recupera os
registros do SQLite
em um Cursor

M.Sc. Mrcio Palheta


67/90
Exerccio 10: mtodo AlunoDAO.listar()
Incio do mtodo para recuperar Alunos do BD
Instruo SQL para
buscar todos os Alunos

O Android recupera os
registros do SQLite
em um Cursor

Vetor de parmetros da
consulta SQL

M.Sc. Mrcio Palheta


68/90
Exerccio 10: final do mtodo listar()

M.Sc. Mrcio Palheta


69/90
Percorre todos os
Exerccio 10: final do mtodo listar()
registros do Cursor

M.Sc. Mrcio Palheta


70/90
Percorre todos os
Exerccio 10: final do mtodo listar()
registros do Cursor

Carrega o objeto Aluno


com campos do Cursor

M.Sc. Mrcio Palheta


71/90
Percorre todos os
Exerccio 10: final do mtodo listar()
registros do Cursor

Carrega o objeto Aluno


com campos do Cursor

Adiciona o Aluno
coleo de resposta

M.Sc. Mrcio Palheta


72/90
Percorre todos os
Exerccio 10: final do mtodo listar()
registros do Cursor

Carrega o objeto Aluno


com campos do Cursor

Adiciona o Aluno
coleo de resposta
android.database.SQLException
filha de RuntimeException

M.Sc. Mrcio Palheta


73/90
Percorre todos os
Exerccio 10: final do mtodo listar()
registros do Cursor

Carrega o objeto Aluno


com campos do Cursor

Adiciona o Aluno
coleo de resposta
android.database.SQLException
filha de RuntimeException

Garante o fechamento
da conexo com BD
M.Sc. Mrcio Palheta
74/90
Exerccio 11: Crie Aluno.toString()

M.Sc. Mrcio Palheta


75/90
Exerccio 12: Atualizao da Tela inicial
Altere o arquivo: /res/layout/listaalunoslayout.xml
Deixe apenas a ListView

M.Sc. Mrcio Palheta


76/90
Exerccio 13: camada de controle
No mtodo onCreate() da ListaAlunosActivity, deixe
apenas a associao da ListView

M.Sc. Mrcio Palheta


77/90
Exerccio 13: camada de controle
No mtodo onCreate() da ListaAlunosActivity, deixe
apenas a associao da ListView

Vamos manter a
associao entre
view e controller

M.Sc. Mrcio Palheta


78/90
Exerccio 13: camada de controle
No mtodo onCreate() da ListaAlunosActivity, deixe
apenas a associao da ListView

Vamos manter a
associao entre
view e controller
O cdigo para carga da
coleo de alunos
ficar em outro mtodo

M.Sc. Mrcio Palheta


79/90
Exerccio 14: Mudana de tipos
Nossa coleo de Alunos deve deixar de ser List<String>
e se tornar List<Aluno>
Altere, tambm, o tipo do ArrayAdapter

M.Sc. Mrcio Palheta


80/90
Exerccio 14: Mudana de tipos
Nossa coleo de Alunos deve deixar de ser List<String>
e se tornar List<Aluno>
Altere, tambm, o tipo do ArrayAdapter

M.Sc. Mrcio Palheta


81/90
Exerccio 15: carga dos dados
Na ListaAlunosActivity, crie o mtodo carregarLista() para
acesso ao DAO e carga da coleo de Alunos

M.Sc. Mrcio Palheta


82/90
Exerccio 15: carga dos dados
Na ListaAlunosActivity, crie o mtodo carregarLista() para
Novo mtodo para
acesso ao DAO e carga da coleo de Alunos
carga da coleo
de alunos

M.Sc. Mrcio Palheta


83/90
Exerccio 15: carga dos dados
Na ListaAlunosActivity, crie o mtodo carregarLista() para
Novo mtodo para
acesso ao DAO e carga da coleo de Alunos
carga da coleo
de alunos

Acesso camada
de modelo

M.Sc. Mrcio Palheta


84/90
Exerccio 15: carga dos dados
Na ListaAlunosActivity, crie o mtodo carregarLista() para
Novo mtodo para
acesso ao DAO e carga da coleo de Alunos
carga da coleo
de alunos

Acesso camada
de modelo Atualizao
da tela

M.Sc. Mrcio Palheta


85/90
Exerccio 16: Carga no onResume()
Na classe ListaAlunosActivity, vamos cria o mtodo
onResume()
Nesse mtodo, vamos fazer a chamada a carregarLista()

M.Sc. Mrcio Palheta


86/90
Execute a nossa App

M.Sc. Mrcio Palheta


87/90
O que vem a seguir?
Complemento do cadastro - excluso (ContextMenu)
Compartilhar informaes entre Activities Intents
Intent implicita Chamada telefnica para um aluno
Envio e Recebimento de SMS
Navegar em site do Aluno e Envio de email
Cmera e arquivos
LayoutInflater
Servios de background
Integrao via JSON
M.Sc. Mrcio Palheta
88/90
Referncias

www.caelum.com.br
d.android.com
LECHETA, Ricardo. Google Android, 3a edio,
Novatec, So Paulo, 2013
Cdigo fonte completo:
https://github.com/marciopalheta/cursosandroid

M.Sc. Mrcio Palheta


89/90
Captulo 04: Persistncia com SQLite

Você também pode gostar