Sei sulla pagina 1di 10

Introduo ao Desenvolvimento para Android (Parte IV)

22-10-2012, em Tutoriais, por Jair Rebello 3tweetsretweet

3 inShare Email Este o ltimo artigo desta srie que iniciamos com o intuito de introduzir o desenvolvimento Android e tudo que tange os primeiros passos para se ter uma aplicao android em funcionamento. J aprendemos a construir algumas funcionalidades, construir todo o ambiente necessrio para desenvolver em Android e agora chegou a vez de aprender a usar banco de dados em nossas aplicaes. Acaso tenha desejo pode acessar os trs primeiros artigos desta srie, voc ter muito a aprender se deseja aventurar-se em aplicaes mobile:

Introduo ao Desenvolvimento para Android (Parte I) Introduo ao Desenvolvimento para Android (Parte II) Introduo ao Desenvolvimento para Android (Parte III)

No primeiro artigo aprendemos a como configurar todo o ambiente necessrio para o desenvolvimento de aplicaes, no segundo, aprendemos a construir um pequeno aplicativo com as principais funes matemticas e no terceiro aprendemos mais sobre layouts, algo muito necessrio em aplicaes mdias e grandes, chegou a vez de aprender sobre banco de dados em aplicaes Android.

O QUE UM BANCO DE DADOS?

Banco de dados uma coleo de dados organizados de tal forma que haja alguma relao entre eles, ou seja, um aglomerado de informaes que se tenha como recuperar alguma destas informaes quando se desejar. Voc j pensou se todos os sistemas empresarias funcionassem em planilhas? Voc j viveu a situao de ter tantos dados em uma planilha do Excel ao ponto de perd-las? Essa justamente a funo de um banco de dados, organizar informaes seja a quantidade pequena, mdia ou grande.

BANCO DE DADOS EM APLICAES ANDROID


Todas as aplicaes que trabalham com uma quantidade razovel de dados devem ter recursos que facilitem o tratamento destes dados, com aplicaes mobile, mais especificamente aplicaes android no seria diferente. No adianta muito ter uma grande quantidade de informaes guardadas seno h um mtodo eficiente para recuperar quando necessrio. Qualquer aplicao que guarda dados em nossos dispositivos Android utilizam-se de banco de dados: contatos, tarefas, registro de chamadas e outros. Esses aplicativos utilizam-se de um mecanismo nativo de persistncia de dados chamado SQLite, o SQLite funciona como um SGBD comum como o MySQL e prov todas as principais funcionalidades, logicamente obedecendo as limitaes impostas por dispositivos bem mais modestos que os desktops ou servidores.

Cada aplicativo android independente, ou seja, cada um consegue apenas ler e escrever os dados que o prprio aplicativo possui, mesmo que em algumas situaes seja necessrio compartilhar esses dados, quando isso acontece utilizado o recurso de provedor de dados, mas isto apenas visto em aplicaes mais robustas. A implementao do SQLite permite a insero, atualizao e seleo de dados muito semelhante aos utilizados em aplicativos comuns como o PHP, lembra-se do SELECT feito para algum aplicativo, quase certo que o mesmo funcione tambm no SQLite e isso simplesmente fantstico. O SQLite no um projeto do Google como o Android, apesar de o mesmo ajudar e muito na comunidade que mantm o mesmo, fazendo com que muitos projetos que compartilhem o SQLite tenham muito mais qualidade em suas aplicaes. No SQLite a base de dados apenas um arquivo em disco, todas as estruturas necessrias em sua base de dados so guardadas neste arquivo e o mecanismo abstrai todo o esforo necessrio para abrir, fechar e manipular este arquivo.

SQLITE NA PRTICA
Para demonstrar o uso do SQLite irei primeiramente mostrar uma classe que utiliza recursos SQLite, como a criao do banco de dados, seleo de dados, insero e atualizao dos mesmos. Depois de mostrar a classe iremos passo-a-passo demonstrar o que cada parte do cdigo faz. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
package br.com.a7.mobile.DAO; //seo de imports import java.util.ArrayList; import br.com.a7.mobile.classes.Produto; import import import import import android.content.Context; android.database.Cursor; android.database.sqlite.SQLiteDatabase; android.database.sqlite.SQLiteDatabase.CursorFactory; android.database.sqlite.SQLiteOpenHelper;

public class DAOProduto extends SQLiteOpenHelper{ private String sql; private SQLiteDatabase bd; //construtor da classe public DAOProduto(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); // TODO Auto-generated constructor stub bd = getWritableDatabase(); sql = " CREATE TABLE IF NOT EXISTS PRODUTO (" + "id INTEGER PRIMARY KEY autoincrement, descricao TEXT, und TEXT," + "fabricante TEXT, embalagem DECIMAL(18,2), vlvenda DECIMAL(18,2)," + "vlminimo DECIMAL(18,2), vlvenda2 DECIMAL(18,2), estoque DECIMAL(18,2)" + ");"; bd.execSQL(sql); bd.close(); } //excluir tabela public void drop(){ bd = getWritableDatabase(); sql = "DROP TABLE PRODUTO"; bd.execSQL(sql); bd.close(); } public void dadosTeste(){ bd = getWritableDatabase(); sql = " INSERT INTO PRODUTO (id, descricao, und, fabricante, embalagem," + "vlvenda, vlminimo, vlvenda2, estoque) VALUES

44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93

(null, 'COMPUTADOR', 'UND', 'APPLE'," + "'EMBALAGEM', '1000.00', '900.00', '1050.00', 100);"; bd.execSQL(sql); sql = " INSERT INTO PRODUTO (id, descricao, und, fabricante, embalagem," + "vlvenda, vlminimo, vlvenda2, estoque) VALUES (null, 'MONITOR', 'UND', 'APPLE'," + "'EMBALAGEM', '500.00', '400.00', '450.00', 50);"; bd.execSQL(sql); sql = " INSERT INTO PRODUTO (id, descricao, und, fabricante, embalagem," + "vlvenda, vlminimo, vlvenda2, estoque) VALUES (null, 'IPHONE', 'UND', 'APPLE'," + "'EMBALAGEM', '1700.00', '1500.00', '1750.00', 10);"; bd.execSQL(sql); bd.close(); } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub } // recuperar uma instncia de produto pela chave primria public Produto get(String id){ Produto p = new Produto(); bd = getWritableDatabase(); sql = "SELECT id,descricao, vlvenda, estoque, vlminimo, embalagem, fabricante, und FROM PRODUTO where id = " + id + ";"; Cursor cursor = bd.rawQuery(sql, null); cursor.moveToFirst(); p.setId(cursor.getInt(0)); p.setDescricao(cursor.getString(1)); p.setVlVenda(cursor.getDouble(2)); p.setEstoque(cursor.getDouble(3)); p.setVlMinimo(cursor.getDouble(4)); p.setEmbalagem(cursor.getDouble(5)); p.setFabricante(cursor.getString(6)); p.setUnd(cursor.getString(7)); return p; } // recuperar uma coleo de produtos pesquisando pela descrio public ArrayList<Produto> getByDesc(String desc){ bd = getWritableDatabase(); sql = "SELECT id,descricao, vlvenda, estoque, vlminimo, embalagem, fabricante, und FROM PRODUTO where descricao like '%" + desc + "%';"; Cursor cursor = bd.rawQuery(sql, null); ArrayList<Produto> produtos = new ArrayList<Produto>(); while(cursor.moveToNext()){ Produto p = new Produto(); p.setId(cursor.getInt(0)); p.setDescricao(cursor.getString(1)); p.setVlVenda(cursor.getDouble(2)); p.setEstoque(cursor.getDouble(3));

p.setVlMinimo(cursor.getDouble(4)); 94 p.setEmbalagem(cursor.getDouble(5)); 95 p.setFabricante(cursor.getString(6)); 96 p.setUnd(cursor.getString(7)); 97 produtos.add(p); } 98 bd.close(); 99 cursor.close(); 10 return produtos; 0 } 10 1 // recuperar todos os produtos public ArrayList<Produto> get(){ 10 bd = getWritableDatabase(); 2 sql = "SELECT id,descricao, vlvenda, estoque, vlminimo, 10 embalagem, fabricante, und FROM PRODUTO;"; 3 Cursor cursor = bd.rawQuery(sql, null); ArrayList<Produto> produtos = new ArrayList<Produto>(); 10 while(cursor.moveToNext()){ 4 Produto p = new Produto(); 10 p.setId(cursor.getInt(0)); 5 p.setDescricao(cursor.getString(1)); 10 p.setVlVenda(cursor.getDouble(2)); p.setEstoque(cursor.getDouble(3)); 6 p.setVlMinimo(cursor.getDouble(4)); 10 p.setEmbalagem(cursor.getDouble(5)); 7 p.setFabricante(cursor.getString(6)); 10 p.setUnd(cursor.getString(7)); 8 produtos.add(p); } 10 bd.close(); 9 cursor.close(); 11 return produtos; 0 } 11 @Override 1 public void onUpgrade(SQLiteDatabase db, int oldVersion, int 11 newVersion) { 2 // TODO Auto-generated method stub 11 3 } 11 4 } 11 5 11 6 11 7 11 8 11 9 12 0 12 1

12 2 12 3 12 4 12 5 12 6 12 7 12 8 12 9 13 0 13 1 13 2 13 3 13 4 13 5 13 6 13 7

EXPLICAO DO CDIGO
A primeira parte a sesso de imports, onde fazemos toda a importao de outras classes que utilizaremos em nossa classe DAOProduto, atente para a classe Produto, que classe que guarda toda a definio de produto, como seus atributos. Com isso todas as vezes que precisarmos manipular atributos de produtos utilizaremos a classe Produto, tornando muito mais prtico e simples. Alm de deixar a lgica de banco de dados totalmente separada das classes de negcio. Na linha 20 temos o construtor da classe DAOProduto nele podemos encontrar a criao da tabela, ou seja, todas as vezes que a classe DAOProduto instanciada feita uma verificao se a tabela PRODUTO est de fato criada na base de dados do aplicativo, isso evita possveis problemas que podem existir, como excluso de tabelas e outros problemas. Na linha 36 definida a funo drop(), por alguns motivos pode ser necessrio que a tabela seja excluda do banco de dados, como a limpeza de cache do aplicativo, em que

todos os dados gravados pelo aplicativo so deletados para economizar espao no dispositivo. Na linha 67 definida a funo get(String id), ela retorna uma nica instncia de Produto pois feita uma consulta, pesquisando pela chave primria da tabela, este tipo de consulta feita para uma tela de visualizao de detalhes do produto, por exemplo. Na linha 109 definida a funo get(), perceba que estamos fazendo uma sobrecarga de mtodos, uma das funes mais fantsticas do java, com ela podemos definir dois mtodos com o mesmo nome, apenas mudando a passagem dos parmetros e o compilador trata dos pormenores, na funo get() temos o retorno de todos os produtos que existem em nossa base de dados. Por questo de perfomance, dificilmente utilizaremos este mtodo, afinal se tivermos 10.000 produtos a consulta ir demorar uma vida. Rs. Para contornar o problema de performance citado no pargrafo anterior criaremos uma outra funo a getByDesc(String desc) na linha 87 para que retorne apenas os produtos que obedeam a uma condio, a de possuir no nome a String que passaremos por parmetro. Atente que sempre que abrimos uma conexo, fechamos em seguida, isso essencial para que o dispositivo no fique lento com o tempo de utilizao do aplicativo. Para que voc entenda melhor o funcionamento desta classe tambm deixarei a classe Produto: 1 package br.com.a7.mobile.classes; 2 class Produto { 3 public private Integer id; 4 private String descricao; 5 private String und; private String fabricante; 6 private double embalagem; 7 private double vlVenda; 8 private double vlMinimo; 9 private double vlVenda2; 1 private double estoque; 0 public Integer getId() { 1 return id; 1 } 1 public void setId(Integer id) { 2 this.id = id; } 1 public String getDescricao() { 3 return descricao; 1 } 4 public void setDescricao(String descricao) { 1 this.descricao = descricao; } 5 public String getUnd() { 1 return und; 6 } 1 public void setUnd(String und) { 7 this.und = und; } 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

public String getFabricante() { return fabricante; } public void setFabricante(String fabricante) { this.fabricante = fabricante; } public double getEmbalagem() { return embalagem; } public void setEmbalagem(double embalagem) { this.embalagem = embalagem; } public double getVlVenda() { return vlVenda; } public void setVlVenda(double vlVenda) { this.vlVenda = vlVenda; } public double getVlMinimo() { return vlMinimo; } public void setVlMinimo(double vlMinimo) { this.vlMinimo = vlMinimo; } public double getVlVenda2() { return vlVenda2; } public void setVlVenda2(double vlVenda2) { this.vlVenda2 = vlVenda2; } public double getEstoque() { return estoque; } public void setEstoque(double estoque) { this.estoque = estoque; }

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

CONCLUSO
Com este artigo finalizamos a srie de introduo ao desenvolvimento para Android. Nesta srie aprendemos o bsico para voc esteja apto a iniciar suas aventuras pelo desenvolvimento de aplicaes mobile, nunca foi o intuito desta srie esgotar o assunto sobre desenvolvimento Android, o que seria impossvel, e sim instigar a pesquisa e o aperfeioamento em uma tecnologia que apenas cresce em todo o mundo dia aps dia. Espero sinceramente ter esclarecido as dvidas iniciais e mostrado o potencial que existe em aplicaes Android, espero tambm v-los muito em breve com outra srie, mais avanada e que agregue ainda mais valor a sua vida como profissional de desenvolvimento. Abraos!

Potrebbero piacerti anche