Você está na página 1de 8

Compartilhar

mais

Prximo blog

Criar um blog

Login

debug is on the table

domingo, 30 de agosto de 2009

Utilizando Banco de Dados SQLite no Android


Ol povo, Entre as muitas coisas legais que o Android trouxe, o suporte nativo ao banco de dados SQLite foi uma das mais importantes, comercialmente falando. Com ele podemos utilizar os bons e famosos comandos SQL (SELECT, INSERT, UPDATE, DELETE, etc) no mundo mobile. Quem programou em J2ME sabe o quo complicado implementar um repositrio "digno" que suporte uma boa quantidade de registros nessa plataforma (no me falem de RMS... :) Nesse POST, vou colocar trechos de cdigo que utilizam esses conceitos e tentarei explic-los. A parte da interface grfica, vou explicar apenas o que for relevante para o uso com banco de dados. Para criarmos um banco de dados SQLite, podemos: utilizar a ferramenta SQLite Expert Personal e colocar o arquivo do banco de dados na pasta /data/data/pacote_da_minha_aplicacao/databases; ou via cdigo, utilizando uma classe "helper" do SQLite. Utilizaremos a segunda abordagem, pois na vida real no queremos colocar esse arquivo manualmente no aparelho. Pois, caso seja necessria uma atualizao, teremos que atualizar N aparelhos. Mos obra! Vamos criar uma classe que herda de a n d r o i d . d a t a b a s e . s q l i t e . S Q L i t e O p e n H e l p e r . Ela ser responsvel por criar o banco quando a aplicao for instalada (mtodo onCreate) e atualiz-lo para novas verses da aplicao (mtodo onUpgrade).

Treinaweb Cursos
www.treinaweb.com.br Curso de TI Online c/ Certificao. Entre e Matriculese!

Buscar no blog
Pesquisar

Sobre mim

Nelson Glauber de Vasconcelos Leal Recife, Pernambuco, Brazil Mestre em Engenharia de Software pelo C .E.S.A.R. (C entro de Estudos e Sistemas Avanados do Recife - www.cesar.org.br) e formado em Redes de C omputadores pela Universidade Salgado de Oliveira, trabalho com TI desde 2001. Atualmente sou Engenheiro de Sistemas do C .E.S.A.R. trabalhando com desenvolvimento mobile. Tambm sou professor de tecnologias mveis em vrias instituies no nordeste. Meu e-mail [nglaubervasc@gmail.com] Visualizar meu perfil completo

view plain

print

0 1 . 0 2 . 0 3 . 0 4 . 0 5 . 0 6 . 0 7 . 0 8 . 0 9 . 1 0 . 1 1 . 1 2 . 1 3 . 1 4 . 1 5 . 1 6 . 1 7 . 1 8 . 1 9 .

p u b l i cc l a s sS Q L i t e H e l p e re x t e n d sS Q L i t e O p e n H e l p e r{ p r i v a t eS t r i n gs c r i p t C r e a t e ; p r i v a t eS t r i n gs c r i p t D e l e t e ; p u b l i cS Q L i t e H e l p e r ( C o n t e x tc t x ,S t r i n gn o m e B d , i n tv e r s a o B a n c o ,S t r i n gs c r i p t C r e a t e , S t r i n gs c r i p t D e l e t e ){ s u p e r ( c t x ,n o m e B d ,n u l l ,v e r s a o B a n c o ) ; t h i s . s c r i p t C r e a t e=s c r i p t C r e a t e ; t h i s . s c r i p t D e l e t e=s c r i p t D e l e t e ;

Arquivo do blog
2013 (13) 2012 (40) 2011 (60) 2010 (47) 2009 (23) Dezembro (1) Novembro (4) Outubro (3) Setembro (3) Agosto (2) Utilizando Banco de Dados SQLite no Android

p u b l i cv o i do n C r e a t e ( S Q L i t e D a t a b a s ed b ){ d b . e x e c S Q L ( s c r i p t C r e a t e ) ; } p u b l i cv o i do n U p g r a d e ( S Q L i t e D a t a b a s ed b , i n to l d V e r s i o n ,i n tn e w V e r s i o n ){

2 0 . 2 1 . 2 2 . 2 3 . 2 4 .

d b . e x e c S Q L ( s c r i p t D e l e t e ) ; o n C r e a t e ( d b ) ;

JUnit no Eclipse Julho (1) Maio (1) Abril (4) Maro (2) Fevereiro (2) 2008 (12)

Agora vamos criar a classe que realizar as operaes de abrir, selecionar, inserir, atualizar e excluir registos no banco de dados:

Blogs parceiros
view plain print ?

Wellington Cabral
Anim ando Vie ws com Vie wFlippe r e m Android H 5 dias

0 1 . 0 2 . 0 3 . 0 4 . 0 5 . 0 6 . 0 7 . 0 8 . 0 9 . 1 0 . 1 1 . 1 2 . 1 3 . 1 4 . 1 5 . 1 6 . 1 7 . 1 8 . 1 9 . 2 0 . 2 1 . 2 2 . 2 3 . 2 4 . 2 5 . 2 6 . 2 7 . 2 8 . 2 9 . 3 0 . 3 1 . 3 2 . 3 3 . 3 4 . 3 5 . 3 6 . 3 7 . 3 8 . 3 9 . 4 0 . 4 1 . 4 2 . 4 3 . 4 4 . 4 5 . 4 6 . 4 7 . 4 8 . 4 9 . 5 0 . 5 1 . 5 2 . 5 3 . 5 4 . 5 5 . 5 6 . 5 7 . 5 8 . 5 9 . 6 0 . 6 1 . 6 2 . 6 3 . 6 4 . 6 5 . 6 6 . 6 7 . 6 8 .

p u b l i cc l a s sR e p o s i t o r i o C a r r o{ p r i v a t eS Q L i t e D a t a b a s ed b ; p r i v a t eS Q L i t e H e l p e rd b H e l p e r ; p r i v a t es t a t i cf i n a lS t r i n gS C R I P T _ D B _ D E L E T E= " D R O PT A B L EI FE X I S T Sc a r r o s " ; p r i v a t es t a t i cf i n a lS t r i n gS C R I P T _ D B _ C R E A T E= " c r e a t et a b l ec a r r o s( _ i di n t e g e rp r i m a r y" + " k e ya u t o i n c r e m e n t ,n o m et e x tn o tn u l l ," + " p l a c at e x tn o tn u l l ,a n ot e x tn o tn u l l ) ; " ; p u b l i cR e p o s i t o r i o C a r r o( C o n t e x tc t x ) { d b H e l p e r=n e wS Q L i t e H e l p e r ( c t x ," c u r s o " ,1 , S C R I P T _ D B _ C R E A T E ,S C R I P T _ D B _ D E L E T E ) ; } p r i v a t el o n gi n s e r i r ( C a r r oc ) { C o n t e n t V a l u e sc v=n e wC o n t e n t V a l u e s ( ) ; c v . p u t ( " n o m e " ,c . g e t N o m e ( ) ) c v . p u t ( " p l a c a " ,c . g e t P l a c a ( ) ) ; c v . p u t ( " a n o " ,c . g e t A n o ( ) ) ; d b=d b H e l p e r . g e t W r i t a b l e D a t a b a s e ( ) ; l o n gi d=d b . i n s e r t ( " c a r r o s " ,n u l l ,c v ) ; d b . c l o s e ( ) ; r e t u r ni d ; } p r i v a t el o n ga t u a l i z a r ( C a r r oc ) { C o n t e n t V a l u e sc v=n e wC o n t e n t V a l u e s ( ) ; c v . p u t ( " n o m e " ,c . g e t N o m e ( ) ) ; c v . p u t ( " p l a c a " ,c . g e t P l a c a ( ) ) ; c v . p u t ( " a n o " ,c . g e t A n o ( ) ) ; d b=d b H e l p e r . g e t W r i t a b l e D a t a b a s e ( ) ; l o n gr o w s=d b . u p d a t e ( " c a r r o s " ,c v ," _ i d=? " , n e wS t r i n g [ ] {S t r i n g . v a l u e O f ( c . g e t I d ( ) ) } ) ; d b . c l o s e ( ) ; r e t u r nr o w s ;/ /q t d e .d el i n h a sa f e t a d a s

Cdigo Google
Ne x t Le ve l Apps: Inscrie s e nce rradas H uma semana

Blog da Especializa
O m e lhor do MVC e m Javascript H um ms

Leocadio Tin
Fre d: Android drawable re sizing tool H 2 meses

Tips4Dev
R e cupe rando inform ae s da cone x o IP no iO S H 3 meses

Debug de Cdigos
Para nunca m ais e sque ce r [5] Android H 3 meses

Cogumelo de Barba
MO BAs so os novos MMO R PGs H 3 meses

Mobidia: Idias & Mobilidade


Slide s das Pale stra Novas te nd ncias para a Educao a Distncia H um ano

Ricardo Gilson - iPhone, Rpido e Fcil | iPhone, Rpido e Fcil


C odificao de UR L no iO S H um ano

De A a CTRL Z
Se ndo um ninja nos browse rs (Parte I): O s atalhos que faltavam (e que vo ficar incom ple tos at a parte II) H um ano

p u b l i ci n te x c l u i r ( i n ti d ) { d b=d b H e l p e r . g e t W r i t a b l e D a t a b a s e ( ) ; i n tr o w s=d b . d e l e t e ( " c a r r o s " ," _ i d=? " , n e wS t r i n g [ ] {S t r i n g . v a l u e O f ( i d )} ) ; r e t u r nr o w s ;/ /q t d e .d el i n h a sa f e t a d a s } { p u b l i cL i s t < C a r r o >b u s c a r C a r r o P o r N o m e ( S t r i n gn o m e ) L i s t < C a r r o >l i s t a=n e wA r r a y L i s t < C a r r o > ( ) ; S t r i n g [ ]c o l u m n s=n e wS t r i n g [ ] { " _ i d " ," n o m e " ," p l a c a " ," a n o " } ; S t r i n g [ ]a r g s=n e wS t r i n g [ ] { n o m e + " % " } ; d b=d b H e l p e r . g e t W r i t a b l e D a t a b a s e ( ) ; C u r s o rc=d b . q u e r y ( " c a r r o s " ,c o l u m n s , " n o m el i k e? " ,a r g s ,n u l l ,n u l l ," n o m e " ) ; c . m o v e T o F i r s t ( ) ; w h i l e ( ! c . i s A f t e r L a s t ( ) ) { C a r r oc a r r o=f i l l C a r r o ( c ) ; l i s t a . a d d ( c a r r o ) ; c . m o v e T o N e x t ( ) ; } c . c l o s e ( ) ; d b . c l o s e ( ) ; r e t u r nl i s t a ;

Inscreva-se
Postagens

6 9 . 7 0 . 7 1 . 7 2 . 7 3 . 7 4 . 7 5 . 7 6 . 7 7 .

p r i v a t eC a r r of i l l C a r r o ( C u r s o rc ){ C a r r oc a r r o=n e wC a r r o ( ) ; c a r r o . s e t I d ( ( i n t ) c . g e t L o n g ( 0 ) ) ; c a r r o . s e t N o m e ( c . g e t S t r i n g ( 1 ) ) ; c a r r o . s e t P l a c a ( c . g e t S t r i n g ( 2 ) ) ; c a r r o . s e t A n o ( c . g e t S t r i n g ( 3 ) ) ; r e t u r nc a r r o ; }

Como vocs podem ver, estou usando uma classe Carro tambm. No vou list-la aqui por se tratar de um POJO com os campos: id, nome, placa e ano do veculo. Na classe acima, o construtor recebe uma referncia do contexto da aplicao. Ela repassada para nossa classe SQLHelper, que por sua vez, se encarregar de criar o nosso banco de dados se ele no existir. A classe a n d r o i d . d a t a b a s e . s q l i t e . S Q L i t e O p e n H e l p e r(superclasse do nosso helper) tem o mtodo getWritableDatabase() que retorna uma instncia da classe a n d r o i d . d a t a b a s e . s q l i t e . S Q L i t e D a t a b a s e , que ser nosso canal de comunicao com o banco de dados. As operaes de inserir e atualizar utilizam: uma string que representa o nome da tabela no banco de dados; e um objeto da classe ContentValues, que nada mais do que um conjunto par/valor com os parmetros do comando SQL. Mas notem que o mtodo update recebe ainda uma String que representa a clusula WHERE do comando UPDATE (do SQL), bem como os parmetros da mesma, que esto mapeados via caracter '?'. "Por tabela", o mtodo excluir vocs j devem ter entendido :) O ltimo mtodo o buscarCarroPorNome(String). Toda consulta SQL, retorna um objeto do tipo Cursor. Ele bem parecido com o ResultSet do JDBC. Os parmetros do mtodo query so, respectivamente: String nome da tabela, String[] colunasDaTabela, String clausulaWhere, String[] paramsWhere, String groupBy, String having, String orderBy. Para exibir os dados, precisaremos criar um Adapter, que converter um Carro em uma linha de uma lista. Crie o arquivo de layout list_item.xml e coloque-o na pasta res/layout:

view plain

print

0 1 . 0 2 . 0 3 . 0 4 . 0 5 . 0 6 . 0 7 . 0 8 . 0 9 . 1 0 . 1 1 . 1 2 . 1 3 . 1 4 . 1 5 . 1 6 . 1 7 . 1 8 . 1 9 . 2 0 . 2 1 . 2 2 .

< ? x m lv e r s i o n = " 1 . 0 "e n c o d i n g = " u t f 8 " ? > < L i n e a r L a y o u ta n d r o i d : l a y o u t _ h e i g h t = " w r a p _ c o n t e n t " x m l n s : a n d r o i d = " h t t p : / / s c h e m a s . a n d r o i d . c o m / a p k / r e s / a n d r o i d " a n d r o i d : l a y o u t _ w i d t h = " f i l l _ p a r e n t " a n d r o i d : i d = " @ + i d / c a r r o R o w " > < T e x t V i e wa n d r o i d : l a y o u t _ w i d t h = " w r a p _ c o n t e n t " a n d r o i d : l a y o u t _ h e i g h t = " w r a p _ c o n t e n t " a n d r o i d : i d = " @ + i d / t x t N o m e " a n d r o i d : l a y o u t _ w e i g h t = " 1 " a n d r o i d : t e x t S i z e = " 2 0 d p " / > < T e x t V i e wa n d r o i d : l a y o u t _ w i d t h = " w r a p _ c o n t e n t " a n d r o i d : l a y o u t _ h e i g h t = " w r a p _ c o n t e n t " a n d r o i d : i d = " @ + i d / t x t A n o " a n d r o i d : l a y o u t _ m a r g i n R i g h t = " 1 0 p x " / > < T e x t V i e wa n d r o i d : l a y o u t _ w i d t h = " w r a p _ c o n t e n t " a n d r o i d : l a y o u t _ h e i g h t = " w r a p _ c o n t e n t " a n d r o i d : i d = " @ + i d / t x t P l a c a " a n d r o i d : l a y o u t _ m a r g i n R i g h t = " 1 0 p x " / >

2 3 . 2 4 .

< / L i n e a r L a y o u t >

E agora, vamos criar nosso adapter.

view plain

print

0 1 . 0 2 . 0 3 . 0 4 . 0 5 . 0 6 . 0 7 . 0 8 . 0 9 . 1 0 . 1 1 . 1 2 . 1 3 . 1 4 . 1 5 . 1 6 . 1 7 . 1 8 . 1 9 . 2 0 . 2 1 . 2 2 . 2 3 . 2 4 . 2 5 . 2 6 . 2 7 . 2 8 . 2 9 . 3 0 . 3 1 . 3 2 . 3 3 . 3 4 . 3 5 . 3 6 . 3 7 . 3 8 . 3 9 . 4 0 . 4 1 . 4 2 . 4 3 . 4 4 . 4 5 . 4 6 .

p u b l i cc l a s sC a r r o L i s t A d a p t e re x t e n d sB a s e A d a p t e r{ p r i v a t eC o n t e x tc o n t e x t ; p r i v a t eL i s t < C a r r o >l i s t a ; p u b l i cC a r r o L i s t A d a p t e r ( C o n t e x tc t x , L i s t < C a r r o >c a r r o s ){ c o n t e x t=c t x ; l i s t a=c a r r o s ;

p u b l i ci n tg e t C o u n t ( ){ r e t u r nl i s t a . s i z e ( ) ; } p u b l i cO b j e c tg e t I t e m ( i n ta r g 0 ){ r e t u r nl i s t a . g e t ( a r g 0 ) ; } p u b l i cl o n gg e t I t e m I d ( i n ta r g 0 ){ r e t u r nl i s t a . g e t ( a r g 0 ) . g e t I d ( ) ; } p u b l i cV i e wg e t V i e w ( i n tp o s ,V i e wc o n v e r t V i e w , V i e w G r o u pp a r e n t ){ C a r r oc=l i s t a . g e t ( p o s ) ; L a y o u t I n f l a t e ri n f l a t e r= ( L a y o u t I n f l a t e r ) c o n t e x t . g e t S y s t e m S e r v i c e ( C o n t e x t . L A Y O U T _ I N F L A T E R _ S E R V I C E ) ; V i e wv i e w=i n f l a t e r . i n f l a t e ( R . l a y o u t . l i s t _ i t e m ,n u l l ) ; ( ( T e x t V i e w ) v i e w . f i n d V i e w B y I d ( R . i d . t x t N o m e ) ) . s e t T e x t ( c . g e t N o m e ( ) ) ; ( ( T e x t V i e w ) v i e w . f i n d V i e w B y I d ( R . i d . t x t A n o ) ) . s e t T e x t ( c . g e t A n o ( ) ) ; ( ( T e x t V i e w ) v i e w . f i n d V i e w B y I d ( R . i d . t x t P l a c a ) ) . s e t T e x t ( c . g e t P l a c a ( ) ) ; } r e t u r nv i e w ;

Crie uma classe que herde de ListActivity e no onCreate, digite o seguinte cdigo:
view plain print ?

0 1 . 0 2 . 0 3 .

R e p o s i t o r i o C a r r oc a r r o s D B=n e wR e p o s i t o r C a r r o ( t h i s ) ; L i s t < C a r r o > l i s t a=c a r r o s D B . b u s c a r C a r r o P o r N o m e ( " " ) ; s e t A d a p t e r ( n e wC a r r o L i s t A d a p t e r ( t h i s ,l i s t a ) ) ;

Para utilizar os demais mtodos facinho, no ? Basta criar objetos do tipo Carro, no qual os valores sero preenchidos por widgets (componentes de UI) e pass-los como parmetros para os mtodos do RepositorioCarro. Espero que tenham entendido e gostado :) Editado em 03/11/2011

Sempre que fizermos uma operao no banco de dados importante que encerremos a conexo com ele. Tinha faltado isso nesse post, e agora lembrei de corrirgir. 4br405 nglauber
Postado por Nelson Glauber de Vasconcelos Leal s 21:20 Recomende isto no Google Marcadores: Android, Banco de Dados, BD, Database, Exemplo, SQLite, Tutorial

17 comentrios:
Wagner disse... Muito bom Nelson, Primeiro de tudo, muito obrigado! Estou desenvolvendo uma app para um trabalho do curso, como tinha apenas dois dias (agora um dia) para desenvolver resolvi utilizar a xtreamxml, pensando que seria mais fcil para meu projeto. Mas com esse seu post descobri como fcil utilizar a SQLite no Android. Muito obrigado pela contribuio :) abraco! 28 de novembro de 2009 06:09 Felipe Alexandre Rodrigues disse... Parabns! Ficou muito bom. Eu estava procurando por um post falando sobre banco de dados no android ! Valeu mesmo 2 de outubro de 2010 08:44 thiago silva disse... Glauber, pelo que observei caso eu tenha um banco de dados fsico e queira coloca-lo na aplicao teria que ser feito sempre de forma manual?Tanto para o simulador quanto celular? Tenho todo o script do banco de dados, porm sempre tem o detalhe de consertar as Strings para serem aceitas.Existe alguma maneira prtica para fazer este procedimento? Fico no aguardo... Abraos! 27 de abril de 2011 20:20 Nelson Glauber de Vasconcelos Leal disse... Oi thiago, Na verdade voc pode adotar algumas abordagens quando vc tem um banco de dados inicial para a aplicao. 1) Utilizar um arquivo de script que ser executado no seu SQLiteOpenHelper. 2) Utilizar um arquivo XML para alimentar o banco (recm criado) 3) C olocar o arquivo DB dentro do APK e copi-lo (via API java) para o diretrio /data/data/pacote.da.app/databases. 4) Acessar um WebService... Quem manda o fregus :)

4br405 29 de abril de 2011 19:24 Annimo disse... Procurei na internet algum exemplo da opo 3(C olocar o arquivo DB dentro do APK e copi-lo (via API java) para o diretrio /data/data/pacote.da.app/databases.),mas no obtive sucesso. :/ 31 de maio de 2011 19:31 Nelson Glauber de Vasconcelos Leal disse... Oi Annimo, C omo voc foi a milhonsima pessoa que me perguntou isso :) eu resolvi fazer um POST s com isso. http://nglauber.blogspot.com/2011/06/copiando-um-bancode-dados-sqlite-no.html Espero que te ajude. 4br405, nglauber 2 de junho de 2011 08:40 carla disse... OI NELSON. GOSTARIA DE SABER SE VC PODE ME TIRAR UMA DVIDA. EU C RIEI UMA TABELA, S QUE QUERO ADIC IONAR NOVOS C AMPOS NNESSA TABELA, MAS D ERRO TODA VEZ QUE RODO A APLIC A O INSERINDO NOVOS C AMPOS. TENTEI O ALTER TABLE, TBME NO FUNC IONOU.TEM ALGUMA SOLU O??? GRATA C ARLA 10 de junho de 2011 11:05 Nelson Glauber de Vasconcelos Leal disse... Oi C arla, Me manda um e-mail explicando como voc est querendo fazer essa atualizao. 4br405, nglauber 12 de junho de 2011 19:36 lindemberg disse... Nelson, muito bem explicado o tutorial mas eu ainda fiquei com algumas dvidas, ond e com vc declara esse setC ontent no final do cdigo? se possivel for, me envia o seu cdigo completo pra mim dar uma sacada. Pode ser? berg_wylhame@hotmail.com 25 de junho de 2011 17:49 Jh disse... Ei, estou com algumas dvidas, por exemplo como fao para saber o id de um carro criado, por exemplo? jessicapiresf@gmail.com 6 de julho de 2011 20:04 Nelson Glauber de Vasconcelos Leal disse... Oi Jh, O mtodo insert da classe SQliteDatabase retorna um long que o ID do registro que foi includo. http://developer.android.com/reference/android/database/sqli te/SQLiteDatabase.html

4br405, nglauber 6 de julho de 2011 20:25 Annimo disse... ol bem, testei o cdigo numa aplicao que estou desenvolvendo, funcionou nas duas primeiras vezes que executei, depois surgiu o erro no listar. Sendo que esse erro afeta a activity que solta a lista na tela para que eu tenha acesso pelo menu as opes de inserir e buscar, assim nao consigo inserir e nem buscar. esse erro pode ser um problema no meu eclipse ou sdk?? pq de uma hora pra outra ele nao funcionou mais e o cdigo tem ares de estar certo :/ 27 de setembro de 2012 13:08 Nelson Glauber de Vasconcelos Leal disse... Oi Annimo, Tenta apagar a aplicao e instalar de novo. Normalmente isso acontece quando voc altera a estrutura da tabela aps ter executado a primeira vez (e consequentemente o banco j est criado) e tenta acessar esse campo novo, que no existe. Tenta postar o stacktrace aqui. 4br405, nglauber 28 de setembro de 2012 13:31 Alysson Bispo disse... Glauber, no emulador funcionou beleza, mas no aparelho no deu certo no....tem algum misterio ? alguma permisso para adicionar ? 6 de dezembro de 2012 03:36 Andr Victor disse... Muito bom o tutorial, Glauber. Me ajudou bastante! 7 de abril de 2013 15:39 Alcool disse... Nelson como eu faria pra a seguinte situacao: Alimentar minhas tabelas atravez de arquivo XML. Por ex: Tenho minha app Forca de vendas com as tabelas cliente, produto, etc... apartir de uma XML como alimento cada tabela ?? 29 de maio de 2013 12:35 Nelson Glauber de Vasconcelos Leal disse... Oi Alcool, Voc pode usar esse post abaixo para ver como ler um arquivo XML http://nglauber.blogspot.com.br/2011/11/lendo-rss-noandroid.html E para cada linha lida, voc adiciona no banco... 4br405, nglauber 30 de maio de 2013 05:44 Postar um comentrio

Postagem mais recente

Incio

Postagem mais antiga

Você também pode gostar