De : Luciano Al ves da Silva (lucianopascal@yahoo.com.br)
www.apostilaandroid.net
Rio de Janeiro Novembro 2012
2
Aviso sobre esta apostila
Antes de iniciar a leitura deste material, veja esses avisos importantes:
Esse material NO PODER SER DISTRIBUDO, em hiptese alguma, em outros sites da Internet ou atravs outros processos/meios .
Essa material , em hiptese alguma, NO PODE SER COMERCIALIZADO tanto pela Internet ou de forma impressa.
Se por acaso voc ver este material sendo distribudo em outro site ou sendo comercializado (sem ser pelo site oficial da apostila), por favor, entre em contato com o autor (ver e-mail na primeira pgina).
3
Sobre o Autor da Apostila
Luciano Alves da Silva Bacharelado em Cincia da Computao pela UNISUAM e Ps-Graduado em Docncia do Ensino Superior pelo Instituto A Vez do Mestre (Universidade Cndido Mendes - UCAM). Possui conhecimento e domnio das linguagens de programao Pascal, J ava, C/C++, C#, Visual Basic, Delphi, PHP e HTML. J criou Ambientes de Desenvolvimento Integrado (conhecidos como IDE) como o MakeWare (que trabalha com as linguagens Pascal, C++e J ava) e o AlgoWare (interpretador de algoritmos).
autor tambm dos seguintes livros, pela editora AGBOOK
- Aprenda Passo a Passo a Programar em Android Guia Essencial para Desenvolvedores
- Desenvolvendo J ogos com a Plataforma XNA Guia para Desenvolvedores.
- Desenvolvendo J ogos com a Ferramenta RPG Maker VX Guia do Usurio.
4
Apresentao
Este material dedicado para aqueles que desejam trabalhar com banco de dados usando o SQLite, presente na plataforma Android para o armazenamento e gerenciamento de dados.
Caso voc, que esteja lendo este material, seja iniciante em programao com Android, recomendo antes adquirir no site oficial a Apostila de Android Programando Passo a Passo 5 Edio, pois esse material nada mais do que um complemento da apostila citada. Agora caso voc j possua conhecimento bsico sobre programao com Android, e deseja aprender banco de dados, este material lhe dar todo o passo a passo para a construo de programas em Android que trabalhem com banco de dados.
5
ndice analtico
Captulo 1 - Programao com Banco de Dados no Android ....................... 6 1.1) A linguagem SQL .................................................................................... 6 1.1.1) O comando CREATE TABLE ............................................................ 7 1.1.2) O comando INSERT ......................................................................... 7 1.1.3) O comando UPDATE ........................................................................ 8 1.1.4) O comando DELETE ......................................................................... 8 1.1.5) O comando SELECT ......................................................................... 8 1.2) Trabalhando com o SQLite do Android ............................................... 9 1.2.1) O mtodo query ................................................................................ 9 1.2.2) O mtodo insert............................................................................... 10 1.2.3) O mtodo update ............................................................................ 10 1.2.4) O mtodo delete.............................................................................. 10 1.2.5) O mtodo execSQL ......................................................................... 11 1.3) Exemplos de SQL usando as funes do Android ........................... 11 1.3.1) Fazendo uma consulta a tabela (usando SELECT) ........................ 11 1.3.2) Inserindo dados (usando INSERT) ................................................. 12 1.3.3) Atualizando dados (usando UPDATE) ............................................ 12 1.3.4) Removendo dados (usando DELETE) ............................................ 13 1.3.5) Criando uma tabela (usando CREATE TABLE) .............................. 13 1.4) Desenvol vendo uma aplicao usando banco de dados ................. 16 Concluso a respeito do material ................................................................. 35
6
Captulo 1 - Programao com Banco de Dados no Android
plataforma Android possui um mecanismo em que podemos trabalhar com banco de dados usando a linguagem SQL, o SQLite. Aqui neste material irei mostrar como trabalhar com banco de dados no Android.
Atualmente as aplicaes Android (seja ela uma aplicao comercial, jogo e etc) sempre esto guardando informaes (como por exemplo, o nome do cliente, endereo e etc). Essas informaes so armazenadas normalmente em banco de dados, podendo esse banco ser on-line (situado em um servidor para essa finalidade) ou local (situado no prprio dispositivo).
A plataforma Android j oferece (presente em sua arquitetura) um conjunto de recursos (bibliotecas e classes) que permite que ns possamos trabalhar com banco de dados (baseado no SQLite, um sistema gerenciador de banco de dados (SGBD)).
Para trabalharmos com banco de dados, naturalmente, preciso ter o conhecimento e o domnio da linguagem SQL (Structured Query Language), que uma linguagem padro voltada para trabalhar com BD. Antes de comearmos a trabalhar com BD no Android, precisamos conhecer e entender sobre est linguagem SQL.
1.1) A linguagem SQL
A linguagem SQL (Structured Query Language) uma linguagem de consulta estruturada que realiza consultas banco de dados. A SQL dividida em duas sub-linguagens: LMD (Linguagem de Manipulao de Dados ou Data Manipulation Language DML) e LDD (Linguagem de Definio de Dados ou Data Definition Language DDL) . A LDD um conjunto de comandos dentro da SQL usada para a definio das estruturas de dados, fornecendo as instrues que permitem a criao, modificao e remoo das tabelas, assim como criao de ndices. J a LMD o grupo de comandos dentro da linguagem SQL utilizado para a recuperao, incluso, remoo e modificao de informaes em bancos de dados.
Vamos conhecer agora alguns comandos bsicos muito utilizados da linguagem SQL. A
7
1.1.1) O comando CREATE TABLE
Esse comando serve para criar tabelas em banco de dados. Veja a sua sintaxe abaixo:
create table <t abel a>( <campo1> <t i po> [ <const r ai nt s>] [ , <campo2> <t i po> [ <const r ai nt s>] , . . . , <campon> <t i po> [ <const r ai nt s> ] ] )
Exemplo: Criar uma tabela chamada cadastro com os seguintes campos:
- codusuario: Do tipo inteiro e com propriedades de chave primria e auto numerao.
- nome : Do tipo texto e requerido
- idade : Do tipo inteiro e requerido
create table cadast r o( codusuar i o i nt eger pr i mar y key aut oi ncr ement , nome t ext not nul l , i dade i nt eger not nul l )
Outro exemplo : Criar uma tabela chamada cadastro (com os mesmos campos do exemplo acima) no banco de dados, se ela no existir.
create table if not exists cadast r o( codusuar i o i nt eger pr i mar y key aut oi ncr ement , nome t ext not nul l , i dade i nt eger not nul l )
1.1.2) O comando INSERT
Esse comando serve para inserir dados em uma tabela j existente. Veja a sua sintaxe abaixo:
insert into <t abel a>( <campo1>, . . . <campon>) values( <val or 1>, . . . , <val or n>)
Exemplo: Adicionar dados na tabela cadastro (que foi criada com o comando CREATE TABLE), conforme mostrado abaixo:
nome : Luciano idade : 23
8
OBS: Como o campo codusuario do tipo auto-numerao, o valor dele j definido automaticamente.
insert into cadast r o( nome, i dade) values( Luci ano , 23)
1.1.3) O comando UPDATE
Esse comando serve para atualizar dados de uma tabela j existente. Veja a sua sintaxe abaixo:
update <t abel a> set <campo1> = <val or 1>[ , . . . , <campon> = <val or n>] where <condi o>
Exemplo: Atualizar a idade do primeiro registro (Luciano) para 27 anos.
update cadast r o set i dade = 27 where codusuar i o=1
1.1.4) O comando DELETE
Esse comando serve para remover dados de uma tabela j existente. Veja a sua sintaxe abaixo:
delete from <t abel a> where <condi o>
Exemplo: Remover o primeiro registro da tabela (Luciano)
delete from cadast r o where codusuar i o=1
1.1.5) O comando SELECT
Esse comando serve para fazer consultas em uma tabela j existente. Veja a sua sintaxe abaixo:
select <campo1>[ , <campo2>, . . . , <campon>] from <t abel a> where <condi o>
Exemplos :
Mostrar todos os dados cadastrados na tabela
9
select codusuar i o, nome, i dade from cadast r o
Mostrar todos os nomes cuja idade seja maior que 25.
select nome from cadast r o where ( i dade >= 25)
Mostrar todos os nomes cujo prefixo seja David, ou melhor, todos que se chamam David independente do sobrenome.
select nome from cadast r o where ( nome like Davi d% )
A partir de agora vamos ver abaixo algumas funes do Android que trabalham com banco de dados.
1.2) Trabalhando com o SQLite do Android
No Android existe um pacote chamado android.sqlite, onde existe uma classe chamada SQLiteDataBase, que possui os seguintes mtodos, conforme mostrado em seguida:
1.2.1) O mtodo query
O mtodo query realiza uma consulta SQL no banco de dados (equivale ao comando SELECT). Essa funo retorna uma instncia (objeto) do tipo Cursor. Vejamos a sintaxe do mtodo em seguida:
Cur sor quer y( St r i ng <t abel a>, St r i ng[ ] <col unas>, St r i ng <condi cao_de_busca>, St r i ng[ ] <sel eci onAr gs>, St r i ng <gr oupby>, St r i ng <havi ng>, St r i ng <or der by>)
Vamos conhecer os parmetros que iremos utilizar dessa funo:
<tabela>: Neste parmetro voc informa o nome da tabela.
<coluna>: Neste parmetro a(s) coluna(s) que o banco possui.
<condio de busca>: Aqui voc informa a condio de busca de dados. Este parmetro funciona como se fosse a clausula where do SQL, onde informada a condio de busca.
O restante dos parmetros iremos trabalhar em seu valor null.
10
1.2.2) O mtodo insert
O mtodo insert realiza uma insero de dados na tabela (equivale ao comando INSERT). Vejamos a sintaxe deste mtodo:
l ong i nser t ( St r i ng <t abel a>, St r i ng <nul l Col umnHack>, Cont ent Val ues <val ues>)
Essa funo possui trs parmetros:
<tabela>: Neste parmetro voc informa o nome da tabela.
<nullColumnHack>: O SQL no permite a insero de linhas em branco, logo, se o valor de uma coluna for vazio, ele ser iniciado com o valor null.
<values>: Este parmetro possui os valores a serem adicionados na tabela.
1.2.3) O mtodo update
O mtodo update realiza uma atualizao de dados na tabela (equivale ao comando UPDATE). Vejamos agora a sintaxe deste mtodo :
i nt updat e( St r i ng <t abel a>, Cont ent Val ues <val ues>, St r i ng <condi o>, St r i ng <ar gument os_condi cao>)
Essa funo possui trs parmetros:
<tabela>: Neste parmetro voc informa o nome da tabela.
<values>: Este parmetro possui os valores a serem adicionados na tabela.
<condio>: Aqui voc informa a condio para a realizao da atualizao dos dados.
<argumentos_condicao>: Aqui voc informa os argumentos relativos condio informada.
1.2.4) O mtodo delete
O mtodo delete realiza a remoo de dados na tabela (equivale ao comando DELETE). Vejamos a sintaxe deste mtodo:
i nt del et e( St r i ng <t abel a>, St r i ng <condi o>, St r i ng <ar gument os_condi cao>)
Essa funo possui trs parmetros:
11
<tabela>: Neste parmetro voc informa o nome da tabela.
<condio>: Aqui voc informa a condio para a realizao da remoo dos dados da tabela.
<argumentos_condicao>: Aqui voc informa os argumentos relativos condio informada.
1.2.5) O mtodo execSQL
O mtodo execSQL executa uma consulta SQL (como CREATE TABLE, INSERT INTO, UPDATE, DELETE e etc.). No possvel usar a clausula SELECT nesta funo. Para esse tipo de situao, use o mtodo query. Vejamos a sintaxe deste mtodo:
voi d execSQL( St r i ng sql )
Vamos fazer algumas comparaes da funo execSQL, que permite sintaxes de comando SQL com as demais funes, como update,insert e delete para a realizao de uma consulta SQL.
1.3) Exemplos de SQL usando as funes do Android
1.3.1) Fazendo uma consulta a tabela (usando SELECT)
- Comando SQL :
select codusuar i o, nome, i dade from cadast r o
- Usando a funo query :
quer y( cadast r o, ( new St r i ng[ ] {codusuar i o, nome, i dade}) , null, null, null, null, null) ;
- Comando SQL :
select nome from cadast r o where i dade > 24
12
- Usando a funo query :
quer y( cadast r o, ( new St r i ng[ ] {nome}) , i dade > 24 , null, null, null, null) ;
1.3.2) Inserindo dados (usando INSERT)
- Comando SQL :
insert into cadast r o( nome, i dade) values( Luci ano , 23)
- Usando a funo execSQL
execSQL( i nser t i nt o cadast r o( nome, i dade) val ues( Luci ano , 23) ; ) ;
Usando a funo insert :
Cont ent Val ues val or = new Cont ent Val ues( ) ;
val or . put ( nome, Luci ano ) ; val or . put ( i dade, 23) ;
i nser t ( cadast r o, null, val or ) ;
1.3.3) Atualizando dados (usando UPDATE)
- Comando SQL :
update cadast r o set i dade = 27 where codusuar i o=1
- Usando a funo execSQL
execSQL( updat e cadast r o set i dade = 27 wher e ( codusuar i o=1) ; ) ;
Usando a funo update :
Cont ent Val ues val or = new Cont ent Val ues( ) ;
val or . put ( i dade, 27) ;
updat e( cadast r o, val or , codusuar i o=1) ;
13
1.3.4) Removendo dados (usando DELETE)
- Comando SQL :
delete from cadast r o where codusuar i o=1
- Usando a funo execSQL
execSQL( del et e f r om cadast r o wher e ( codusuar i o=1) ; ) ;
Usando a funo delete :
del et e( cadast r o, codusuar i o=1, null) ;
1.3.5) Criando uma tabela (usando CREATE TABLE)
- Comando SQL :
create table cadast r o( codusuar i o i nt eger pr i mar y key aut oi ncr ement , nome t ext not nul l , i dade i nt eger not nul l )
- Usando a funo execSQL
execSQL( cr eat e t abl e cadast r o( codusuar i o i nt eger pr i mar y key aut oi ncr ement , nome t ext not nul l , i dade i nt eger not nul l ) ; ) ;
Agora vamos conhecer as funes responsveis por criar e abrir banco de dados no Android.
SQLDat abase openOr Cr eat eDat abase( St r i ng nome_do_banco, i nt mode, Cur sor Fact or y cf ) ;
Essa funo abre ou cria um novo banco de dados. Voc deve especificar o nome do banco e o modo de abertura (somente leitura ; somente escrita e etc.) e um terceiro parmetro, que normalmente null. Veja um exemplo abaixo:
O comando acima abre ou cria o banco de dados chamado dbbanco.
14
Quando realizamos uma consulta do tipo SELECT usando a funo query, ela retorna um objeto do tipo Cursor, onde nela esto armazenados os registros solicitados pela consulta. Vamos ver abaixo os mtodos da classe Cursor:
Mtodo Descrio
bool ean moveToFi r st ( ) Move o cursor para o primeiro registro da tabela.
bool ean moveToPr evi ous( ) Move o cursor para o registro anterior da tabela.
bool ean moveToNext ( ) Move o cursor para o prximo registro da tabela.
bool ean moveToLast ( ) Move o cursor para o ltimo registro da tabela.
i nt get Count ( ) Retorna o nmero de registros da tabela. i nt get Col umnI ndex( St r i ng col umnName) Retorna o ndice da coluna na tabela, atravs do seu nome, que passado como parmetro.
St r i ng get Col umnName( i nt col umnI ndex) Retorna o nome da coluna na tabela, atravs do seu ndice, que passado como parmetro.
i nt get I nt ( i nt col umnI ndex) Retorna o valor do campo, tendo como seu parmetro o seu ndice, convertido em int. Lembre-se : o ndice do primeiro campo 0, o ndice do segundo campo 1 e assim por diante.
f l oat get Fl oat ( i nt col umnI ndex) Retorna o valor do campo, tendo como seu parmetro o seu ndice, convertido em float. Lembre-se : o ndice do primeiro campo 0, o ndice do segundo campo 1 e assim por diante.
doubl e get Doubl e( i nt col umnI ndex) Retorna o valor do campo, tendo como seu parmetro o seu ndice, convertido em double. Lembre-se : o ndice do primeiro campo 0, o ndice do segundo campo 1 e assim por diante.
shor t get Shor t ( i nt col umnI ndex) Retorna o valor do campo, tendo como seu parmetro o seu ndice, convertido em short. Lembre-se : o ndice do primeiro campo 0, o ndice do segundo campo 1 e assim por diante.
15
Vou mostrar agora um exemplo para que voc tenha um melhor entendimento do mecanismo de banco de dados do Android.
Imagine uma tabela chamada cadastro com os seguintes dados abaixo:
Cur sor c = db. quer y( " cadast r o" , ( new St r i ng[ ] {" nome" , " i dade" }) , " i dade < 32" , null, null, null, null) ;
Observe que a linha acima cria um objeto do tipo Cursor que vai receber o resultado da consulta da funo query, que retorna uma instncia do mesmo tipo. Logo, a instncia retornada pela funo query na verdade, retorna uma tabela resultante da consulta. Veja esse resultado abaixo:
nome idade Bruna 23 Carla 20
Continuando a codificao. Veja a linha abaixo:
c. moveToFi r st ( ) ;
A linha acima coloca o ponteiro no primeiro registro da tabela. A linha:
St r i ng nome = c. get St r i ng( 0) ;
Retorna o valor do campo nome do primeiro registro, no caso, Bruna. Veja agora a prxima linha:
i nt i dade = c. get I nt ( 1) ;
Retorna o valor do campo idade do primeiro registro, no formato int. Neste caso, o valor retornado 23. A linha:
c. moveToNext ( ) ;
16
A linha acima avana para o prximo registro. A linha:
nome = c. get St r i ng( 0) ;
Retorna o valor do campo nome do segundo registro, no caso, Carla. Veja agora a prxima linha:
i nt i dade = c. get I nt ( 1) ;
Retorna o valor do campo idade do segundo registro, no formato int. Neste caso, o valor retornado 20.
Bom, com certeza voc entendeu como funciona o mecanismo de manipulao de banco de dados no Android. Agora vamos por esse aprendizado na prtica.
1.4) Desenvol vendo uma aplicao usando banco de dados
Com o que j aprendemos neste captulo (e tambm ns captulos e tpicos anteriores) j podemos desenvolver uma aplicao mais interessante. Para tornar o aprendizado mais interessante vamos criar uma aplicao de cadastro de pessoas. Nessa aplicao o usurio vai informar os seguintes dados : nome, profisso e idade.
Essa aplicao vai possuir trs telas, cada uma com as seguintes funcionalidades:
Tela principal (tela com opes): Nessa tela da aplicao teremos um menu que dar acesso ao cadastro do usurio e a visualizao dos usurios cadastrados.
Tela de cadastro: Nesse tela o usurio ir preencher os campos solicitados pela aplicao e em seguida o mesmo poder cadastrar para que as informaes sejam registradas.
Tela de visualizao de dados: Nessa tela podero ser visualizados os dados (usurios) cadastrados. Se nada foi cadastrado na aplicao, ser exibida uma mensagem informando essa situao.
Nessa aplicao para armazenar os dados eu fao uso de uma estrutura de dados do tipo lista (duplamente encadeada). Nessa estrutura os dados so armazenados em sequncia, e acessados tanto sequencialmente e na sua ordem inversa de cadastro (avanando e retrocedendo pelos registros).
Bom, vamos construir a nossa aplicao. Crie um novo projeto com os seguintes dados abaixo:
17
Application Name: AplicacaoDeCadastroBD
Project Name: AplicacaoDeCadastroBD
Package Name : com.example.aplicacaodecadastrobd
Build SDK : Android 2.2 (API 8)
Minimum Required SDK : API 8: Android 2.2 (Froyo)
Activity Name: AplicacaoCadastroActivity
Layout Name : activity_aplicacao_cadastro
Title : Aplicao de Cadastro (BD)
Dentro da pasta res/drawable-mdpi coloque uma figura que represente o cone da nossa aplicao. Para esta aplicao utilizei uma imagem de extenso PNG chamada profile.png.
Altere a estrutura de layout da sua aplicao para o LinearLayout e em APAGUE o componente TextView. Feito isso adicione os seguintes componentes na sequncia:
ImageView
Propriedade Valor Src (imagem) profile.png
TextView
Propriedade Valor
Text Bem vindo a Aplicao de Cadastro de Pessoas.Este um pequeno programa de demonstrao de cadastro.Selecione uma das opes abaixo:
Button
Propriedade Valor Id btcadastrarpessoas Width fill_parent Text Cadastrar pessoa
18
Button
Propriedade Valor Id btlistarpessoas Width fill_parent Text Listar pessoas cadastradas
Seguindo os passos acima, a aplicao deve estar de acordo com a figura seguinte:
Layout da tela principal da aplicao
Vejamos agora a estutura XML da tela principal da nossa aplicao:
<Li near Layout xml ns: andr oi d="http://schemas.android.com/apk/res/android" xml ns: t ool s="http://schemas.android.com/tools" andr oi d: i d="@+id/LinearLayout1" andr oi d: l ayout _wi dt h="match_parent" andr oi d: l ayout _hei ght ="match_parent" andr oi d: or i ent at i on="vertical" >
<I mageVi ew andr oi d: i d="@+id/imageView1" andr oi d: l ayout _wi dt h="wrap_content" andr oi d: l ayout _hei ght ="wrap_content" andr oi d: sr c="@drawable/profile" / >
<Text Vi ew andr oi d: i d="@+id/textView1" andr oi d: l ayout _wi dt h="wrap_content" andr oi d: l ayout _hei ght ="wrap_content" andr oi d: t ext ="Bem vindo a Aplicao de Cadastro de Pessoas.Este um pequeno programa de demonstrao de cadastro. Selecione uma das opes abaixo:" / >
19
<But t on andr oi d: i d="@+id/btcadastrarpessoa" andr oi d: l ayout _wi dt h="fill_parent" andr oi d: l ayout _hei ght ="wrap_content" andr oi d: t ext ="Cadastrar pessoa" / >
<But t on andr oi d: i d="@+id/btlistarpessoas" andr oi d: l ayout _wi dt h="fill_parent" andr oi d: l ayout _hei ght ="wrap_content" andr oi d: t ext ="Listar pessoas cadastradas" / >
</ Li near Layout >
Agora vamos criar mais uma tela (arquivo de layout XML) para nossa aplicao. Para isso vamos clicar com o boto direito sobre a pasta layout e em seguida vamos chamar o recurso de criao de arquivos de layout XML para Android (o Android XML Layout File, conforme j foi mostrado anteriormente no ltimo exemplo). O nome do nosso arquivo de layout XML vai ser cadastro (a estrutura que vamos utilizar para essa tela ser o LinearLayout).
Depois de criado o arquivo vamos adicionar os seguintes componentes na sequncia:
ImageView
Propriedade Valor Src (Imagem) profile
TextView
Propriedade Valor Text Mdulo de cadastro.Digite seus dados abaixo:
TextView
Propriedade Valor Text Nome:
EditText (Plain Text)
Propriedade Valor Id ednome Text (Deixar em branco)
20
TextView
Propriedade Valor Text Profisso:
EditText (Plain Text)
Propriedade Valor Id edprofissao Width fill_parent Text (Deixar em branco)
TextView
Propriedade Valor Text Idade:
EditText (Plain Text)
Propriedade Valor Id edidade Width fill_parent Text (Deixar em branco)
Seguindo os passos acima, a aplicao deve estar de acordo com a figura seguinte:
Layout da tela de cadastro
Bom, ainda no acabou. Agora vamos adicionar uma estrutura LinearLayout (Horizontal) que ser responsvel por organizar os botes de forma horizontal
21
logo aps a EditText que representa o campo idade. Aps adicionar essa estrutura, modifique a seguintes propriedades dela, conforme abaixo:
Propriedade Valor Gravity center
A propriedade Gravity , similar a propriedade Orientation, determina o alinhamento dos componentes dentro da estrutura, que no caso acima est alinhando os componentes de forma centralizada, ou seja, os componentes vo estar dispostos de forma horizontal (um ao lado do outro) e todos esses componentes estaro organizados de forma centralizada. Seguindo o mesmo procedimento acima, vamos adicionar dois componentes do tipo Button dentro dessa estrutura, e vamos mudar as seguintes propriedades citadas abaixo.
Button
Propriedade Valor Id btcadastrar Text Cadastrar pessoa
Button
Propriedade Valor Id btcancelar Text Cancelar
Seguindo os passos acima, o Layout de nossa aplicao deve estar de acordo com a figura abaixo:
22
Layout da tela de cadastro
Vamos ver agora a estrutura XML da tela de cadastro da aplicao:
<?xml ver si on="1.0" encodi ng="utf-8"?> <Li near Layout xml ns: andr oi d="http://schemas.android.com/apk/res/android" andr oi d: l ayout _wi dt h="match_parent" andr oi d: l ayout _hei ght ="match_parent" andr oi d: or i ent at i on="vertical" >
<I mageVi ew andr oi d: i d="@+id/imageView1" andr oi d: l ayout _wi dt h="wrap_content" andr oi d: l ayout _hei ght ="wrap_content" andr oi d: sr c="@drawable/profile" / >
<Text Vi ew andr oi d: i d="@+id/textView1" andr oi d: l ayout _wi dt h="wrap_content" andr oi d: l ayout _hei ght ="wrap_content" andr oi d: t ext ="Mdulo de cadastro. Digite seus dados abaixo:" / >
<Text Vi ew andr oi d: i d="@+id/textView2" andr oi d: l ayout _wi dt h="wrap_content" andr oi d: l ayout _hei ght ="wrap_content" andr oi d: t ext ="Nome:" / >
<Edi t Text andr oi d: i d="@+id/ednome" andr oi d: l ayout _wi dt h="match_parent"
23
andr oi d: l ayout _hei ght ="wrap_content" >
<r equest Focus / > </ Edi t Text >
<Text Vi ew andr oi d: i d="@+id/textView3" andr oi d: l ayout _wi dt h="wrap_content" andr oi d: l ayout _hei ght ="wrap_content" andr oi d: t ext ="Profisso:" / >
<Edi t Text andr oi d: i d="@+id/edprofissao" andr oi d: l ayout _wi dt h="match_parent" andr oi d: l ayout _hei ght ="wrap_content" / >
<Text Vi ew andr oi d: i d="@+id/textView4" andr oi d: l ayout _wi dt h="wrap_content" andr oi d: l ayout _hei ght ="wrap_content" andr oi d: t ext ="Idade:" / >
<Edi t Text andr oi d: i d="@+id/edidade" andr oi d: l ayout _wi dt h="match_parent" andr oi d: l ayout _hei ght ="wrap_content" / >
<Li near Layout andr oi d: l ayout _wi dt h="match_parent" andr oi d: l ayout _hei ght ="wrap_content" andr oi d: gr avi t y="center" >
<But t on andr oi d: i d="@+id/btcadastrar" andr oi d: l ayout _wi dt h="wrap_content" andr oi d: l ayout _hei ght ="wrap_content" andr oi d: t ext ="Cadastrar" / >
<But t on andr oi d: i d="@+id/btcancelar" andr oi d: l ayout _wi dt h="wrap_content" andr oi d: l ayout _hei ght ="wrap_content" andr oi d: t ext ="Cancelar" / >
</ Li near Layout >
</ Li near Layout >
Agora vamos criar mais uma tela (arquivo de layout XML) para nossa aplicao. O nome da nossa tela vai se chamar lista_pessoas_cadastradas.
24
Aps criar a tela da nossa aplicao, vamos adicionar os seguintes componentes na sequncia:
ImageView
Propriedade Valor Src (Imagem) profile.png
TextView
Propriedade Valor Text Lista de pessoas cadastradas. Text size 20sp
Seguindo os passos acima, o layout da aplicao deve estar de acordo com a figura seguinte:
Layout da tela de listagem de cadastrados
Ainda no acabou. Vamos adicionar aps o texto uma nova estrutura de layout do tipo LinearLayout (Horizontal), e em seguida vamos mudar as seguintes propriedades dela, conforme abaixo:
LinearLayout
Propriedade Valor Id layoutNome
Agora dentro da estrutura layoutNome vamos adicionar os seguintes componentes na sequncia:
25
TextView
Propriedade Valor Text Nome. Text color #0000ff Text size 20sp
TextView
Propriedade Valor Text (Deixar em branco com espaos) Text size 20sp Id txtnome
Logo aps a estrutura LinearLayout que chamamos de layoutNome, vamos adicionar uma nova estrutura LinearLayout (Horizontal), e em seguida modifique as seguintes propriedades abaixo:
Propriedade Valor Id layoutProfissao
Agora dentro da estrutura layoutProfissao vamos adicionar os seguintes componentes na sequncia:
TextView
Propriedade Valor Text Profisso. Text color #0000ff Text size 20sp
TextView
Propriedade Valor Text (Deixar em branco com espaos) Text size 20sp Id txtprofissao
Agora vamos adicionar uma nova estrutura LinearLayout (Horizontal) e em seguida modifique as seguintes propriedades abaixo:
Propriedade Valor Id layoutIdade
26
Agora dentro da estrutura layoutIdade vamos adicionar os seguintes componentes na sequncia:
TextView
Propriedade Valor Text Idade. Text color #0000ff Text size 20sp
TextView
Propriedade Valor Text (Deixar em branco com espaos) Text color #ffffff Text size 20sp Id txtidade
Agora vamos adicionar uma nova estrutura LinearLayout (Horizontal), como j foi mostrado acima. E depois, modifique as seguintes propriedades abaixo:
Propriedade Valor Id layoutBotoes Gravity Center
Agora dentro da estrutura layoutBotoes vamos adicionar os seguintes componentes na sequncia:
Button
Propriedade Valor Id btvoltar Text Voltar
Button
Propriedade Valor Id @+lista/btavancar Text Avanar
Agora vamos adicionar um Button logo aps a estrutura layoutBotoes que criamos com as seguintes propriedades abaixo:
Button
Propriedade Valor Id btmenu_principal Text Menu principal Width fill_parent
27
Seguindo todos os passos acima, o layout da aplicao deve estar de acordo com a figura abaixo:
Layout da tela de lista de pessoas cadastradas
Vejamos agora a estrutura em XML da tela de listagem de pessoas cadastradas:
<?xml ver si on="1.0" encodi ng="utf-8"?> <Li near Layout xml ns: andr oi d="http://schemas.android.com/apk/res/android" andr oi d: l ayout _wi dt h="match_parent" andr oi d: l ayout _hei ght ="match_parent" andr oi d: or i ent at i on="vertical" >
<I mageVi ew andr oi d: i d="@+id/imageView1" andr oi d: l ayout _wi dt h="wrap_content" andr oi d: l ayout _hei ght ="wrap_content" andr oi d: sr c="@drawable/profile" / >
<Text Vi ew andr oi d: i d="@+id/textView1" andr oi d: l ayout _wi dt h="wrap_content" andr oi d: l ayout _hei ght ="wrap_content" andr oi d: t ext ="Lista de pessoas cadastradas" andr oi d: t ext Si ze="20sp" / >
<Li near Layout andr oi d: i d="@+id/layoutNome" andr oi d: l ayout _wi dt h="match_parent" andr oi d: l ayout _hei ght ="wrap_content" andr oi d: or i ent at i on="horizontal" > <Text Vi ew andr oi d: i d="@+id/textView2" andr oi d: l ayout _wi dt h="wrap_content" andr oi d: l ayout _hei ght ="wrap_content" andr oi d: t ext ="Nome :" andr oi d: t ext Col or ="#0000ff" andr oi d: t ext Si ze="20sp" / >
28
<Text Vi ew andr oi d: i d="@+id/txtnome" andr oi d: l ayout _wi dt h="wrap_content" andr oi d: l ayout _hei ght ="wrap_content" andr oi d: t ext =" " andr oi d: t ext Si ze="20sp" / >
</ Li near Layout >
<Li near Layout andr oi d: i d="@+id/layoutProfissao" andr oi d: l ayout _wi dt h="match_parent" andr oi d: l ayout _hei ght ="wrap_content" > <Text Vi ew andr oi d: i d="@+id/textView3" andr oi d: l ayout _wi dt h="wrap_content" andr oi d: l ayout _hei ght ="wrap_content" andr oi d: t ext ="Profisso:" andr oi d: t ext Col or ="#0000ff" andr oi d: t ext Si ze="20sp" / >
<Text Vi ew andr oi d: i d="@+id/txtprofissao" andr oi d: l ayout _wi dt h="wrap_content" andr oi d: l ayout _hei ght ="wrap_content" andr oi d: t ext =" " andr oi d: t ext Si ze="20sp" / >
</ Li near Layout >
<Li near Layout andr oi d: i d="@+id/layoutIdade" andr oi d: l ayout _wi dt h="match_parent" andr oi d: l ayout _hei ght ="wrap_content" >
<Text Vi ew andr oi d: i d="@+id/textView4" andr oi d: l ayout _wi dt h="wrap_content" andr oi d: l ayout _hei ght ="wrap_content" andr oi d: t ext ="Idade:" andr oi d: t ext Col or ="#0000ff" andr oi d: t ext Si ze="20sp" / >
<Text Vi ew andr oi d: i d="@+id/txtidade" andr oi d: l ayout _wi dt h="wrap_content" andr oi d: l ayout _hei ght ="wrap_content" andr oi d: t ext =" " andr oi d: t ext Si ze="20sp" / >
</ Li near Layout >
<Li near Layout andr oi d: i d="@+id/layoutBotoes" andr oi d: l ayout _wi dt h="match_parent" andr oi d: l ayout _hei ght ="wrap_content" andr oi d: gr avi t y="center" >
29
<But t on andr oi d: i d="@+id/btvoltar" andr oi d: l ayout _wi dt h="wrap_content" andr oi d: l ayout _hei ght ="wrap_content" andr oi d: t ext ="Voltar" / >
<But t on andr oi d: i d="@+id/btavancar" andr oi d: l ayout _wi dt h="wrap_content" andr oi d: l ayout _hei ght ="wrap_content" andr oi d: t ext ="Avanar" / >
</ Li near Layout >
<But t on andr oi d: i d="@+id/btmenu_principal" andr oi d: l ayout _wi dt h="fill_parent" andr oi d: l ayout _hei ght ="wrap_content" andr oi d: t ext ="Menu principal" / >
</ Li near Layout >
No arquivo AplicacaoCadastroActivity.java, vamos adicionar o seguinte cdigo abaixo:
package com. exampl e. apl i cacaodecadast r obd;
import andr oi d. os. Bundl e; import andr oi d. app. Act i vi t y; import andr oi d. app. Al er t Di al og; import andr oi d. cont ent . Cont ext ; import andr oi d. dat abase. Cur sor ; import andr oi d. dat abase. sql i t e. SQLi t eDat abase; import andr oi d. vi ew. Vi ew; import andr oi d. wi dget . But t on; import andr oi d. wi dget . Edi t Text ; import andr oi d. wi dget . Text Vi ew;
public class Apl i cacaoCadast r oAct i vi t y extends Act i vi t y {
But t on bt cadast ar pessoa, bt l i st ar pessoas;
But t on bt cadast r ar , bt cancel ar ;
But t on bt vol t ar , bt avancar , bt menu_pr i nci pal ;
Text Vi ew t xt nome, t xt pr of i ssao, t xt i dade;
Edi t Text ednome, edpr of i ssao, edi dade;
SQLi t eDat abase db;
Cur sor dados;
int numer o_r egi st r os = 0;
30
int posi cao;
@Over r i de public void onCr eat e( Bundl e savedI nst anceSt at e) {
db. execSQL( " cr eat e t abl e i f not exi st s cadusuar i os ( codusuar i o i nt eger pr i mar y key aut oi ncr ement , nome t ext not nul l , pr of i ssao t ext not nul l , i dade i nt eger not nul l ) " ) ;
} catch( Except i on e) {
Exi bi r Mensagem( e. t oSt r i ng( ) ) ; }
Car r egar Tel aPr i nci pal ( ) ; }
public void Car r egar Tel aPr i nci pal ( ) { set Cont ent Vi ew( R. l ayout . activity_aplicacao_cadastro) ;
bt cadast ar pessoa = ( But t on) f i ndVi ewByI d ( R. i d. btcadastrarpessoa) ; bt l i st ar pessoas = ( But t on) f i ndVi ewByI d ( R. i d. btlistarpessoas) ;
bt cadast ar pessoa. set OnCl i ckLi st ener ( new Vi ew. OnCl i ckLi st ener ( ) {
@Over r i de public void onCl i ck( Vi ew ar g0) {
Car r egar Tel aCadast r o( ) ;
} }) ;
bt l i st ar pessoas. set OnCl i ckLi st ener ( new Vi ew. OnCl i ckLi st ener ( ) {
@Over r i de public void onCl i ck( Vi ew ar g0) {
Car r egar Tel aLi st agemPessoas( ) ;
} }) ;
}
31
public void Car r egar Tel aCadast r o( ) {
set Cont ent Vi ew( R. l ayout . cadastro) ; ednome = ( Edi t Text ) f i ndVi ewByI d( R. i d. ednome) ; edpr of i ssao = ( Edi t Text ) f i ndVi ewByI d ( R. i d. edprofissao) ; edi dade = ( Edi t Text ) f i ndVi ewByI d( R. i d. edidade) ;
bt cadast r ar = ( But t on) f i ndVi ewByI d ( R. i d. btcadastrar) ;
bt cancel ar = ( But t on) f i ndVi ewByI d ( R. i d. btcancelar) ;
dados = db. quer y( " cadusuar i os" , ( new St r i ng[ ] {" nome" , " pr of i ssao" , " i dade" }) , null, null, null, null, null) ;
numer o_r egi st r os = dados. get Count ( ) ;
bt cadast r ar . set OnCl i ckLi st ener ( new Vi ew. OnCl i ckLi st ener ( ) {
@Over r i de public void onCl i ck( Vi ew ar g0) {
try {
St r i ng nome = ednome. get Text ( ) . t oSt r i ng( ) ;
St r i ng pr of i ssao = edpr of i ssao. get Text ( ) . t oSt r i ng( ) ;
St r i ng i dade = edi dade. get Text ( ) . t oSt r i ng( ) ;
numer o_r egi st r os++;
db. execSQL( " i nser t i nt o cadusuar i os val ues( " + St r i ng. valueOf ( numer o_r egi st r os) +" , ' " + nome + " ' , ' " + pr of i ssao + " ' , " + i dade + " ) " ) ;
Exi bi r Mensagem( " Regi st r o cadast r ado com sucesso" ) ;
} catch( Except i on e) { Exi bi r Mensagem( " Er r o ao cadast r ar " ) ; }
Car r egar Tel aPr i nci pal ( ) ;
} }) ;
32
bt cancel ar . set OnCl i ckLi st ener ( new Vi ew. OnCl i ckLi st ener ( ) {
@Over r i de public void onCl i ck( Vi ew ar g0) { Car r egar Tel aPr i nci pal ( ) ;
} }) ;
}
public void Car r egar Tel aLi st agemPessoas( ) { try {
dados = db. quer y( " cadusuar i os" , ( new St r i ng[ ] {" nome" , " pr of i ssao" , " i dade" }) , null, null, null, null, null) ; numer o_r egi st r os = dados. get Count ( ) ; posi cao = 1;
}catch( Except i on e) {
Exi bi r Mensagem( " Er r o ao obt er dados do banco" ) ; Car r egar Tel aPr i nci pal ( ) ; return; }
if( numer o_r egi st r os == 0) { Exi bi r Mensagem( " Nenhumr egi st r o cadast r ado" ) ; Car r egar Tel aPr i nci pal ( ) ; return; }
else {
set Cont ent Vi ew( R. l ayout . lista_pessoas_cadastradas) ;
bt vol t ar = ( But t on) f i ndVi ewByI d( R. i d. btvoltar) ; bt avancar = ( But t on) f i ndVi ewByI d( R. i d. btavancar) ; bt menu_pr i nci pal = ( But t on) f i ndVi ewByI d ( R. i d. btmenu_principal) ;
t xt nome = ( Text Vi ew) f i ndVi ewByI d( R. i d. txtnome) ; t xt pr of i ssao = ( Text Vi ew) f i ndVi ewByI d ( R. i d. txtprofissao) ; t xt i dade = ( Text Vi ew) f i ndVi ewByI d( R. i d. txtidade) ;
dados. moveToFi r st ( ) ;
t xt nome. set Text ( dados. get St r i ng ( dados. get Col umnI ndex( " nome" ) ) ) ;
33
t xt i dade. set Text ( dados. get St r i ng ( dados. get Col umnI ndex( " i dade" ) ) ) ;
t xt pr of i ssao. set Text ( dados. get St r i ng ( dados. get Col umnI ndex( " pr of i ssao" ) ) ) ;
bt vol t ar . set OnCl i ckLi st ener ( new Vi ew. OnCl i ckLi st ener ( ) {
@Over r i de public void onCl i ck( Vi ew ar g0) {
if( posi cao == 1) return;
posi cao- - ;
dados. moveToPr evi ous( ) ; t xt nome. set Text ( dados. get St r i ng ( dados. get Col umnI ndex( " nome" ) ) ) ; t xt i dade. set Text ( dados. get St r i ng ( dados. get Col umnI ndex( " i dade" ) ) ) ;
t xt pr of i ssao. set Text ( dados. get St r i ng ( dados. get Col umnI ndex( " pr of i ssao" ) ) ) ;
} }) ;
bt avancar . set OnCl i ckLi st ener ( new Vi ew. OnCl i ckLi st ener ( ) {
@Over r i de public void onCl i ck( Vi ew ar g0) {
if( posi cao == numer o_r egi st r os) return;
posi cao++;
dados. moveToNext ( ) ;
t xt nome. set Text ( dados. get St r i ng ( dados. get Col umnI ndex( " nome" ) ) ) ; t xt i dade. set Text ( dados. get St r i ng ( dados. get Col umnI ndex( " i dade" ) ) ) ;
t xt pr of i ssao. set Text ( dados. get St r i ng ( dados. get Col umnI ndex( " pr of i ssao" ) ) ) ;
} }) ;
bt menu_pr i nci pal . set OnCl i ckLi st ener ( new Vi ew. OnCl i ckLi st ener ( ) {
34
@Over r i de public void onCl i ck( Vi ew v) { Car r egar Tel aPr i nci pal ( ) ; } }) ;
}
}
public void Exi bi r Mensagem( St r i ng mensagem) {
Al er t Di al og. Bui l der di al ogo = new Al er t Di al og. Bui l der ( Apl i cacaoCadast r oAct i vi t y. this) ; di al ogo. set Ti t l e( " Avi so" ) ; di al ogo. set Message( mensagem) ; di al ogo. set Neut r al But t on( " OK" , null) ; di al ogo. show( ) ; }
}
Aps digitarmos os comandos da classe acima, execute a aplicao acima. O resultado voc confere na imagem seguinte:
Aplicao em execuo Tela de cadastro
35
Concluso a respeito do material
Nesta apostila aprendemos a desenvolver aplicaes em Android voltadas para Banco de Dados. Neste material aprendemos o que vem a ser a linguagem SQL e suas principais caractersticas, aprendemos os comandos bsicos da linguagem (para a realizao de consultas, atualizaes de dados e etc.) e tambm como utiliz-las para a construo de aplicaes voltadas para esse propsito, atravs do pacote oferecido pelo Android para o gerenciamento de Banco de Dados. No final, desenvolvemos uma aplicao que faz uso do Banco de Dados para o armazenamento de gerenciamento de dados pessoais.