Ver mensagens sem resposta | Ver tópicos ativos Hoje é 19 Nov 2019, 21:02



Responder Tópico  [ 11 Mensagens ] 
 Conectando ao Banco de dados 
Autor Mensagem
Google employee
Google employee

Data de registro: 28 Jun 2012, 19:13
Mensagens: 1308
Localização: Itaperuna-RJ
Mensagem Conectando ao Banco de dados
Vendo a quantidade de código “suspeito” em relação a conexão com banco de dados, decide fazer esse simples tutorial que vai ilustrar de maneira direta uma boa relação entre activity e banco de dados, os padrões de projeto escolhidos foram Business e Dao que vão dividir muito bem dividido as obrigações de cada classe.

Para começar, irei criar uma activity para cadastro de carros... de maneira estática para poupar trabalho vamos inserir os carros direto no código, isso é apenas um exemplo básico, o importante é a relação.

package br.com.powell.bancodao;

import java.util.ArrayList;

import br.com.powell.business.CarroBusiness;
import br.com.powell.model.Carro;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {
   
    private Button buttonAdicionar;
    private Button buttonMostrar;
    private TextView textCarros;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       
        buttonAdicionar = (Button) findViewById(R.id.buttonAdicionar);
        buttonMostrar = (Button) findViewById(R.id.buttonMostrar);
        textCarros = (TextView) findViewById(R.id.textViewCarros);
       
        buttonAdicionar.setOnClickListener(new OnClickListener() {
           
            @Override
            public void onClick(View arg0) {
                try{
                    Carro carro = new Carro(1L, "Fusca", "Preto");
                    new CarroBusiness(MainActivity.this).adiciona(carro);
                }catch(Exception e){
                    e.printStackTrace();
                    Log.e("", "Faz alguma coisa aqui! " + e.getMessage());
                }
            }
        });
       
        buttonMostrar.setOnClickListener(new OnClickListener() {
           
            @Override
            public void onClick(View arg0) {
                try{
                    ArrayList<Carro> carros = new CarroBusiness(MainActivity.this).retornaTodosCarros();
                    textCarros.setText("Primeiro carro inserido foi um: " + carros.get(0).getDescricao());
                }catch(Exception e){
                    e.printStackTrace();
                    Log.e("", "Faz alguma coisa aqui! " + e.getMessage());
                }
            }
        });
    }
   
    @Override
    public void onDestroy(){
        super.onDestroy();
        new CarroBusiness(getApplicationContext()).fechaBanco();
    }

}
 



Como podemos ver, quando clicar no botão adicionar será inserido um novo carro, se ele existir será atualizado, claro com valores estáticos isso não tem muito sentido... mas adapte para seu caso.

No botão mostrar serão retornados os carros inseridos no banco mas só estou mostrando um pra poupar trabalho .

A classe CarroBusiness que faz a ligação entre nossa activity e a classe Dao que é a responsável por manipular o banco...
No nosso exemplo ela não faz nada demais mas também é um padrão de projeto.

package br.com.powell.business;

import java.util.ArrayList;

import br.com.powell.dao.CarroDAO;
import br.com.powell.model.Carro;
import android.content.Context;
import android.util.Log;

public class CarroBusiness {
   
    private CarroDAO carroDAO;

    public CarroBusiness(Context context) {
        carroDAO = new CarroDAO(context);
    }

    public void adiciona(Carro carro) {
        if(carroDAO.adiciona(carro) > 0){
            Log.d("CarroDao", "Estamos bem!");
        }else{
            Log.e("CarroDao", "Deu zica!");
        }
    }

    public void fechaBanco() {
        carroDAO.fechaBanco();
    }

    public ArrayList<Carro> retornaTodosCarros() {
        return carroDAO.retornaTodosOsCarros();
    }

}
 


e agora o tão famoso DAO, um dos padrões mais usados. Ele vai fazer as operações no banco.
package br.com.powell.dao;

import java.util.ArrayList;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.util.Log;
import br.com.powell.model.Carro;
import br.com.powell.utils.ConstantsUtils;

public class CarroDAO extends AbstractDAO{

    public CarroDAO(Context context) {
        super(context);
    }

    public Long adiciona(Carro carro) {
        if(existe(carro.getId())){
            Log.i("CarroDao", "atualiza");
            return atualiza(carro);
        }else{
            Log.i("CarroDao", "insere");
            return insere(carro);
        }
    }

    private Long atualiza(Carro carro) {
        ContentValues valores = montaValues(carro);
        return (long) retornaBancoParaLeitura().update(ConstantsUtils.TABELA_CARRO, valores, ConstantsUtils.CARRO_ID + " =?", new String[] {carro.getId().toString()});
    }

    private long insere(Carro carro) {
        ContentValues valores = montaValues(carro);
        return retornaBancoParaEscrita().insert(ConstantsUtils.TABELA_CARRO, null, valores);
    }

    private ContentValues montaValues(Carro carro) {
        ContentValues valores = new ContentValues();
        valores.put(ConstantsUtils.CARRO_ID, carro.getId());
        valores.put(ConstantsUtils.CARRO_DESCRICAO, carro.getDescricao());
        valores.put(ConstantsUtils.CARRO_COR, carro.getCor());
        return valores;
    }

    private boolean existe(Long id) {

        try{
            Cursor cursorComIdCarro = retornaBancoParaLeitura().query(ConstantsUtils.TABELA_CARRO, new String[]
                    {ConstantsUtils.CARRO_ID}, ConstantsUtils.CARRO_ID + " =?", new String[] {id.toString()},
                    null, null, null);
            boolean existeCarro = cursorComIdCarro.getCount() > 0;
            fechaCursor(cursorComIdCarro);
            return existeCarro;
        }catch(Exception e){
            return false;
        }
    }

    public ArrayList<Carro> retornaTodosOsCarros() {

        Cursor cursorComTodosOsCarros = retornaBancoParaLeitura().query(ConstantsUtils.TABELA_CARRO, null, null, null,
                null, null, null);
        cursorComTodosOsCarros.moveToFirst();
        ArrayList<Carro> carros = new ArrayList<Carro>();
       
        try{
            do{
                carros.add(montaCarroPelo(cursorComTodosOsCarros));
            }while(cursorComTodosOsCarros.moveToNext());
        }catch(Exception e){
            carros = new ArrayList<Carro>();
        }
        fechaCursor(cursorComTodosOsCarros);
        return carros;
    }

    private Carro montaCarroPelo(Cursor cursorComTodosOsCarros) {

        Carro carro = new Carro();
        carro.setCor(cursorComTodosOsCarros.getString(cursorComTodosOsCarros.getColumnIndex(ConstantsUtils.CARRO_COR)));
        carro.setDescricao(cursorComTodosOsCarros.getString(cursorComTodosOsCarros.getColumnIndex(ConstantsUtils.CARRO_DESCRICAO)));
        carro.setId(cursorComTodosOsCarros.getLong(cursorComTodosOsCarros.getColumnIndex(ConstantsUtils.CARRO_ID)));
        return carro;
    }

}
 


Fiz apenas o básico para ficar melhor a ilustração.
ClienteDAO extends de AbstractDao, que é uma classe que nos permite retornar o banco para ler e salvar dados, fechar e instanciar a classe que cria e mantem o banco de dados, ela nos poupa um bom trabalho economizando métodos.

package br.com.powell.dao;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import br.com.powell.db.DBHelper;

public abstract class AbstractDAO {

        private SQLiteOpenHelper dbHelper;

        public AbstractDAO(Context context) {
                dbHelper = new DBHelper(context);
        }

        public void fechaCursor(Cursor cursor) {
                if (!cursor.isClosed()) {
                        cursor.close();
                }
        }

        public SQLiteDatabase retornaBancoParaEscrita() {
                return dbHelper.getWritableDatabase();
        }

        public SQLiteDatabase retornaBancoParaLeitura() {
                return dbHelper.getReadableDatabase();
        }

        public void fechaBanco() {
                if (dbHelper.getWritableDatabase().isOpen()) {
                        dbHelper.close();
                }
        }

}



Por último a classe DBHelper, ela apenas cria e atualiza o banco.
package br.com.powell.db;

import br.com.powell.utils.ConstantsUtils;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBHelper extends SQLiteOpenHelper{

    private static String name = "carro.db";
    private static int version = 1;

    public DBHelper(Context context) {
        super(context, name , null, version );
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(ConstantsUtils.CRIA_TABELA_CARRO);
    }

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

}
 


Classes extras:
package br.com.powell.model;

public class Carro {
   
    private Long id;
    private String descricao;
    private String cor;
   
    public Carro(long id, String descricao, String cor) {
        setId(id);
        setDescricao(descricao);
        setCor(cor);
    }
    public Carro() {
        // TODO Auto-generated constructor stub
    }
    public String getDescricao() {
        return descricao;
    }
    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }
    public String getCor() {
        return cor;
    }
    public void setCor(String cor) {
        this.cor = cor;
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }

}
 


package br.com.powell.utils;

public class ConstantsUtils {
   
    public static final String TABELA_CARRO = "carro";
    public static final String CARRO_ID = "id";
    public static final String CARRO_DESCRICAO = "descricao";
    public static final String CARRO_COR = "cor";
    public static final String CRIA_TABELA_CARRO = "CREATE TABLE " + TABELA_CARRO + " (" + CARRO_ID +
            " INTEGER PRIMARY KEY, " + CARRO_DESCRICAO + " TEXT, " + CARRO_COR + " TEXT)";

}
 


activity_layout
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    android:orientation="vertical" >


    <TextView
        android:id="@+id/textViewCarros"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium" />


    <Button
        android:id="@+id/buttonAdicionar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Adicionar" />


    <Button
        android:id="@+id/buttonMostrar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Mostrar" />


</LinearLayout>


Existem várias formas de se fazer essa conexão, não sei qual é a melhor, mas posso garantir que essa é muito mais legível e fácil de manter que 95% dos exemplos postados no fórum, pode parecer trabalhoso, mas aumentando a complexidade do projeto vocês verão o quanto ela é eficaz. O projeto pode ser encontrado em https://github.com/raphaelframos/bancoDAO

_________________
Powell


26 Set 2013, 22:03
Perfil
Google employee
Google employee

Data de registro: 28 Jun 2012, 19:13
Mensagens: 1308
Localização: Itaperuna-RJ
Mensagem Re: Conectando ao Bando de dados
Qualquer sugestão ou melhora no código só falar aqui ou dar um fork no projeto lá. Fiz de maneira rápida e simples, mas é bem funcional.
Pra quem gosta de ver o banco, deixei em anexo o plugin que eu uso no eclipse. Só jogar na pasta plugins do seu eclipse e reiniciá-lo. Ae vai em modo DDMS, clica no emulador, acha seu banco no lado direito na parte data/seu package/ databases/ seu banco e clicar numa pilha azul que aparece no alto. Abraços


Você não tem permissões suficientes para ver os arquivos anexados nesta mensagem.

_________________
Powell


26 Set 2013, 22:06
Perfil
Google employee
Google employee
Avatar de usuário

Data de registro: 05 Abr 2011, 04:47
Mensagens: 1968
Localização: Rio de Janeiro
Mensagem Re: Conectando ao Bando de dados
Muito bom!! Ficou bem simples e claro!! Parabéns!!

Abraços!

_________________
Alexandre Antunes
@a3b @bemobi
Moto X

App@Bemobi: Apps Club - Loja de Apps baseada em assinatura que dá direito a usar ~400 Apps.

Campanha: Facilite sua vida e a dos outros usuários.
Objetivo: Vamos colocar a tag [RESOLVIDO] no título do tópico quando o problema for resolvido.


Use a ferramenta de busca do fórum e não espere tanto para que a sua dúvida seja respondida!

Quer trabalhar comigo??


26 Set 2013, 22:10
Perfil WWW
Google employee
Google employee

Data de registro: 28 Jan 2011, 11:42
Mensagens: 1037
Localização: Rio Grande do Sul
Mensagem Re: Conectando ao Bando de dados
Opa! Muito bom xará!

Abraço


29 Set 2013, 00:19
Perfil
Google employee
Google employee

Data de registro: 17 Jul 2011, 11:55
Mensagens: 2657
Localização: São Paulo
Mensagem Re: Conectando ao Bando de dados
+1

_________________
Abraços
___________
Novo App: CalcMat - Calculadora de materiais para concreto
Blog: Agorandroid - sobre programação Android
Twitter: @Agorandroid
___________
Campanha: Facilite sua vida e a dos outros usuários
Cuide do ciclo de vida do seu tópico:
no onCreate(): seja claro, se necessário poste o código e as mensagens de erro.
no onClick(): responda às sugestões.
no onStop(): evite "ninguém?", "alguém?", etc. Procure acrescentar alguma nova informação.
no onDestroy(): resolvido o assunto, poste imediatamente a solução, e, coloque no título do primeiro post [Resolvido].


07 Out 2013, 15:00
Perfil
Google employee
Google employee

Data de registro: 17 Jul 2011, 11:55
Mensagens: 2657
Localização: São Paulo
Mensagem Re: Conectando ao Bando de dados
Só agora que vi: está "Bando de dados" no título! :lol:

_________________
Abraços
___________
Novo App: CalcMat - Calculadora de materiais para concreto
Blog: Agorandroid - sobre programação Android
Twitter: @Agorandroid
___________
Campanha: Facilite sua vida e a dos outros usuários
Cuide do ciclo de vida do seu tópico:
no onCreate(): seja claro, se necessário poste o código e as mensagens de erro.
no onClick(): responda às sugestões.
no onStop(): evite "ninguém?", "alguém?", etc. Procure acrescentar alguma nova informação.
no onDestroy(): resolvido o assunto, poste imediatamente a solução, e, coloque no título do primeiro post [Resolvido].


02 Nov 2013, 16:01
Perfil
Google employee
Google employee

Data de registro: 28 Jun 2012, 19:13
Mensagens: 1308
Localização: Itaperuna-RJ
Mensagem Re: Conectando ao Bando de dados
A H Gusukuma escreveu:
Só agora que vi: está "Bando de dados" no título! :lol:


Auhauahu procurei no dicionário e a definição está: "Agrupamento de dados também pode ser chamado de bando de dados!" UAhUAHuhua Tô igual técnico de futebol tentando justificar o injustificavel uahuahua Vlw Gusukuma!

_________________
Powell


02 Nov 2013, 21:29
Perfil
Google employee
Google employee

Data de registro: 28 Jan 2011, 11:42
Mensagens: 1037
Localização: Rio Grande do Sul
Mensagem Re: Conectando ao Bando de dados
raphaelframos escreveu:
A H Gusukuma escreveu:
Só agora que vi: está "Bando de dados" no título! :lol:


Auhauahu procurei no dicionário e a definição está: "Agrupamento de dados também pode ser chamado de bando de dados!" UAhUAHuhua Tô igual técnico de futebol tentando justificar o injustificavel uahuahua Vlw Gusukuma!


O importante são os 3 pontos Raphael!
AIEUhAOUEoIAEoiuHAE


04 Nov 2013, 10:58
Perfil
Google employee
Google employee

Data de registro: 28 Jun 2012, 19:13
Mensagens: 1308
Localização: Itaperuna-RJ
Mensagem Re: Conectando ao Bando de dados
rafaeldecker escreveu:
O importante são os 3 pontos Raphael!
AIEUhAOUEoIAEoiuHAE


UAhauhu Isso ae! Clássico é clássico e vice-versa, já dizia o poeta!

_________________
Powell


04 Nov 2013, 18:34
Perfil
Android application
Android application

Data de registro: 27 Dez 2013, 13:45
Mensagens: 50
Mensagem Re: Conectando ao Banco de dados
é se der o problema de a tabela ja existe, aconteceu comigo, usei seu tutorial e aconteceu isso, fica dizendo que a tabela ja existe...
parabéns pelo tutorial... abraços


15 Jan 2014, 23:40
Perfil
Google employee
Google employee

Data de registro: 28 Jun 2012, 19:13
Mensagens: 1308
Localização: Itaperuna-RJ
Mensagem Re: Conectando ao Banco de dados
Pode postar seu código pra gente verificar?

_________________
Powell


15 Jan 2014, 23:55
Perfil
Mostrar mensagens anteriores:  Organizar por  
Responder Tópico   [ 11 Mensagens ] 

Quem está online

Usuários vendo este fórum: Abraao, alberto, alex.abrantes, amarildolacerdas, andepunk, andrewort, Androidthebest, ariostorecco, Augusto, Biggs Darklighter, bravus, BTalhadas, btminzon, capo, Chassot, Clauber, Crazy_Droid, Cristranus, culumin, Danilo Dias, Darth Sidious, Darth Vader, Dassi, deborazb, deivisonrpg, dudu795, elisa, emersonbarros, epsilva, fabielp, fabricioLeonard, ffardo, flashking, flaviojps, furlanrapha, geeks, germanno, Guilherme, GuilhermeZampieri, Heritrix, hopper.frf, HyagoRules, IgorBrum, inesfg, JairoCN, jcdeveloper, jeanbr07, Jless@, JMurray, kecyobarros, kidush, konos, lalaine, lfalcao, LForce, lhdiassilva, Lindberg, lkunta, Lord, luciocamilo, luizneto79, marcosandreao, marcosf63, Marlus Dias Silva, MBetioli, mcroft, mikasjau, mmiottobarbosa, monteirojp, MSPRAFAEL, mtomazzi, navegador, neuhaus, nina.rm, nsansilva, PAMinhoto, paulabr, Philipe Alves, phsantos, PicsearchDroid, poponeis, pxcx, rafael.cioban, rafaelvital, Ranieri, raragao, regis.ror, renanpl, ricardo_listadelphi, roberto caceres, rodrigo_mg, romulotales, rsl_master, ruizsa, suportecr, tassiovirginio, thiago@xbrain.com.br, tiago, Tiago Sousa Roch, valaszek, vandob, VILESOFT, Wds, yeltsinlima, Yuri, zorieuq e 1 visitante


Você não pode criar novos tópicos neste fórum
Você não pode responder tópicos neste fórum
Você não pode editar suas mensagens neste fórum
Você não pode excluir suas mensagens neste fórum
Você não pode enviar anexos neste fórum

Procurar por:

© 2007 - 2016 Portal Android - Comunidade de Desenvolvedores Android

Estamos no Linkedin    Siga-nos no twitter


Powered by phpBB - Hospedado por Bemobi