Este é o último artigo desta série que iniciamos com o intuito de introduzir o desenvolvimento Android e tudo que tange os primeiros passos para se ter uma aplicação android em funcionamento. Já aprendemos a construir algumas funcionalidades, construir todo o ambiente necessário para desenvolver em Android e agora chegou a vez de aprender a usar banco de dados em nossas aplicações. Acaso tenha desejo pode acessar os três primeiros artigos desta série, você terá muito a aprender se deseja aventurar-se em aplicações mobile:

No primeiro artigo aprendemos a como configurar todo o ambiente necessário para o desenvolvimento de aplicações, no segundo, aprendemos a construir um pequeno aplicativo com as principais funções matemáticas e no terceiro aprendemos mais sobre layouts, algo muito necessário em aplicações médias e grandes, chegou a vez de aprender sobre banco de dados em aplicações Android.

desenvolvimento android

O QUE É UM BANCO DE DADOS?

Banco de dados é uma coleção de dados organizados de tal forma que haja alguma relação entre eles, ou seja, é um aglomerado de informações que se tenha como recuperar alguma destas informações quando se desejar. Você já pensou se todos os sistemas empresarias funcionassem em planilhas? Você já viveu a situação de ter tantos dados em uma planilha do Excel ao ponto de perdê-las? Essa é justamente a função de um banco de dados, organizar informações seja a quantidade pequena, média ou grande.

BANCO DE DADOS EM APLICAÇÕES ANDROID

Todas as aplicações que trabalham com uma quantidade razoável de dados devem ter recursos que facilitem o tratamento destes dados, com aplicações mobile, mais especificamente aplicações android não seria diferente. Não adianta muito ter uma grande quantidade de informações guardadas senão há um método eficiente para recuperar quando necessário. Qualquer aplicação 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 persistência de dados chamado SQLite, o SQLite funciona como um SGBD comum como o MySQL e provê todas as principais funcionalidades, logicamente obedecendo as limitações 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 próprio aplicativo possui, mesmo que em algumas situações seja necessário compartilhar esses dados, quando isso acontece é utilizado o recurso de provedor de dados, mas isto é apenas visto em aplicações mais robustas. A implementação do SQLite permite a inserção, atualização e seleção 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 também no SQLite e isso é simplesmente fantástico.

O SQLite não é um projeto do Google como o Android, apesar de o mesmo ajudar e muito na comunidade que mantém o mesmo, fazendo com que muitos projetos que compartilhem o SQLite tenham muito mais qualidade em suas aplicações. No SQLite a base de dados é apenas um arquivo em disco, todas as estruturas necessárias em sua base de dados são guardadas neste arquivo e o mecanismo abstrai todo o esforço necessário para abrir, fechar e manipular este arquivo.

SQLITE NA PRÁTICA

Para demonstrar o uso do SQLite irei primeiramente mostrar uma classe que utiliza recursos SQLite, como a criação do banco de dados, seleção de dados, inserção e atualização dos mesmos. Depois de mostrar a classe iremos passo-a-passo demonstrar o que cada parte do código faz.

package br.com.a7.mobile.DAO;

//seção de imports
import java.util.ArrayList;

import br.com.a7.mobile.classes.Produto;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import 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 (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 instância de produto pela chave primária
	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 coleção de produtos pesquisando pela descrição
	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));
			p.setEmbalagem(cursor.getDouble(5));
			p.setFabricante(cursor.getString(6));
			p.setUnd(cursor.getString(7));
			produtos.add(p);
		}
		bd.close();
		cursor.close();
		return produtos;
	}

	// recuperar todos os produtos
	public ArrayList<Produto> get(){
		bd = getWritableDatabase();
		sql = "SELECT id,descricao, vlvenda, estoque, vlminimo, embalagem, fabricante, und FROM PRODUTO;";
		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));
			p.setEmbalagem(cursor.getDouble(5));
			p.setFabricante(cursor.getString(6));
			p.setUnd(cursor.getString(7));
			produtos.add(p);
		}
		bd.close();
		cursor.close();
		return produtos;
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub

	}

}

EXPLICAÇÃO DO CÓDIGO

A primeira parte é a sessão de import’s, é onde fazemos toda a importação de outras classes que utilizaremos em nossa classe DAOProduto, atente para a classe Produto, que é classe que guarda toda a definição de produto, como seus atributos. Com isso todas as vezes que precisarmos manipular atributos de produtos utilizaremos a classe Produto, tornando muito mais prático e simples. Além de deixar a lógica de banco de dados totalmente separada das classes de negócio.

Na linha 20 temos o construtor da classe DAOProduto nele podemos encontrar a criação da tabela, ou seja, todas as vezes que a classe DAOProduto é instanciada é feita uma verificação se a tabela PRODUTO está de fato criada na base de dados do aplicativo, isso evita possíveis problemas que podem existir, como exclusão de tabelas e outros problemas.

Na linha 36 é definida a função drop(), por alguns motivos pode ser necessário que a tabela seja excluída do banco de dados, como a limpeza de cache do aplicativo, em que todos os dados gravados pelo aplicativo são deletados para economizar espaço no dispositivo.

Na linha 67 é definida a função get(String id), ela retorna uma única instância de Produto pois é feita uma consulta, pesquisando pela chave primária da tabela, este tipo de consulta é feita para uma tela de visualização de detalhes do produto, por exemplo.

Na linha 109 é definida a função get(), perceba que estamos fazendo uma sobrecarga de métodos, uma das funções mais fantásticas do java, com ela podemos definir dois métodos com o mesmo nome, apenas mudando a passagem dos parâmetros e o compilador trata dos pormenores, na função get() temos o retorno de todos os produtos que existem em nossa base de dados. Por questão de perfomance, dificilmente utilizaremos este método, afinal se tivermos 10.000 produtos a consulta irá demorar uma vida. Rs.

Para contornar o problema de performance citado no parágrafo anterior criaremos uma outra função a getByDesc(String desc) na linha 87 para que retorne apenas os produtos que obedeçam a uma condição, a de possuir no nome a String que passaremos por parâmetro. Atente que sempre que abrimos uma conexão, fechamos em seguida, isso é essencial para que o dispositivo não fique lento com o tempo de utilização do aplicativo.

Para que você entenda melhor o funcionamento desta classe também deixarei a classe Produto:

package br.com.a7.mobile.classes;

public class Produto {
	private Integer id;
	private String descricao;
	private String und;
	private String fabricante;
	private double embalagem;
	private double vlVenda;
	private double vlMinimo;
	private double vlVenda2;
	private double estoque;

	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	public String getUnd() {
		return und;
	}
	public void setUnd(String und) {
		this.und = und;
	}
	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;
	}
}

CONCLUSÃO

Com este artigo finalizamos a série de introdução ao desenvolvimento para Android. Nesta série aprendemos o básico para você esteja apto a iniciar suas aventuras pelo desenvolvimento de aplicações mobile, nunca foi o intuito desta série esgotar o assunto sobre desenvolvimento Android, o que seria impossível, e sim instigar a pesquisa e o aperfeiçoamento em uma tecnologia que apenas cresce em todo o mundo dia após dia. Espero sinceramente ter esclarecido as dúvidas iniciais e mostrado o potencial que existe em aplicações Android, espero também vê-los muito em breve com outra série, mais avançada e que agregue ainda mais valor a sua vida como profissional de desenvolvimento.

Abraços!

 

Autor: Jair Rebello

Blog do Autor | Artigos do Autor:

Analista de Sistemas, empreendedor e blogueiro que dedica parte de seu tempo para a partilha de material de grande qualidade relacionados a Wordpress, SEO, Tableless, JQuery, PHP, Android e outras tecnologias mais. Pode me encontrar no Escola Sites ou O Android.

  • Explorer - Factory Construction & Ship Building Joomla Theme
  • Justice - Attorney and Law Firm Joomla Template
  • OwnFolio - One Page Personal Portfolio / vCard / Resume / Showcase Joomla Template
  • Big Business - Responsive Template
  • Merab - Creative Multipurpose Drupal 8 Theme
  • Fitness Academy Joomla Template
  • Fruition - Business Joomla Template
  • Educate | Education & Courses, Kindergartens Joomla Template
  • Constructive - Contractors Multipurpose Joomla Landing Page Theme
  • Vina Bubox - VirtueMart Joomla Template for Online Stores
  • BizOne - One Page Parallax Drupal Theme
  • LawHouse - Responsive Lawyers Attorneys Joomla Template

Gostou deste artigo? Então torne-se fã do Blog no Facebook!



Comentários dos Alunos


  1. Paulo
    19 de novembro de 2013

    Olá, sou iniciante em programação Android e gostaria de saber como instanciar a classe Produto.
    Fiz o teste e instanciando com os valores padrões (null, null, null, 0), ele da erro de versão.
    Mudei então o 0 para 1, mas assim parece que ele ainda não cria a tabela.


RSS
Twitter
Facebook
Comentários
ASSINANTES
SEGUIDORES
FÃS
COMENTÁRIOS
7794

Subscrever Newsletter
Subscreva a Newsletter:



Aplicativos Android, iPhone e Muito Mais!




Assine a Escola Criatividade Assine a Newsletter da Escola Criatividade Escola Criatividade no Twitter Escola Criatividade no Facebook Escola Criatividade no Youtube Escola Criatividade no Google Buzz