Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvida no Ex. 12 da Aula 5 - Persistência com SQLite

Como concertar essa parte do código?

ListView lista = (ListView) findViewById(R.id.lista); AlunoDAO alunodao = new AlunoDAO(this); <= List listaAlunosBanco = alunodao.getLista();

Por que o construtor espera um dataBaseHelper e recebe uma activity. Mais como utilizar o contrutor do DBHelper na Classe AlunoDAO?

É possível postar o código inteiro, por que ai eu me acho....

2 respostas
solução!

Olá Henrique! O exercicio/desafio tem como objetivo por em prática um dos princípios importantes da linguagem Java, o Princípio de unica responsabilidade (SRP - Single responsibility principle).

Assim, colocando isso em prática temos que consertar nossa classe AlunoDAO pois ela possui duas responsabilidades: Estabelecer uma conexao com o Banco de Dados e Realizar tarefas quanto aos Alunos presentes no banco de Dados. No entanto, imagine que se você tivesse outra Classe que também tivesse que Conectar com o Banco de Dados para fazer outra tarefa. Você iria ter que repetir o código inteiro de conexão com o Banco de Dados de seu AlunoDAO para esse novo DAO que você gostaria de ter. Alem disso, você estaria utilizando duas conexões diferentes com o Banco de Dados.

Então, uma alternativa é você utilizar Composição ao invés de Herança. Ou seja, ao invés de fazer seu DAO herdar a responsabilidade de conectar-se ao Banco de Dados, você cria uma outra classe que tem por responsabilidade realizar uma conexão e adiciona ela como atributo de seu DAO e de qualquer outro DAO que você possa ter. Para que todos os DAOs utilizem a mesma conexão com o Banco de Dados, colocamos ela para ser recebida como parâmetro no construtor, assim podemos criar o objeto que realiza a conexão e reutiliza-lo em qualquer outro DAO nosso, passando ele como parâmetro no construtor de todos os DAOs que desejamos. Então realizando tudo, você faz com que todos os DAOs utilizem apenas uma conexão e facilita a manutenção de seu código pois toda a responsabilidade de Conectar-se com o banco de dados vai estar organizada em uma única classe.

Assim, você cria uma nova classe e faz ela herdar de SQLiteOpenHelper:

public class DBHelper extends SQLiteOpenHelper{

    private static final String DATABASE = "DB";
    private static final int VERSAO = 1;
    private static final String TABELA = "Alunos";
    public DBHelper(Context context) {
        super(context, DATABASE, null, VERSAO);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "CREATE TABLE " + TABELA + " ("
                + "id INTEGER PRIMARY KEY, " + "nome TEXT UNIQUE NOT NULL, "
                + "site TEXT, " + "endereco TEXT, " + "telefone TEXT, "
                + "nota REAL" + ");";
        db.execSQL(sql);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        String sql = "DROP TABLE " + TABELA + ";";
        db.execSQL(sql);
        onCreate(db);

    }

    public static String getTabela() {
        return TABELA;
    }


}

E adiciona no seus DAOs um atributo da classe que seja uma variável de referencia ao Objeto que realiza a conexão e para atribuir esse objeto você pode utilizar o construtor.

public class AlunoDAO {
    private DBHelper helper;

    public AlunoDAO(DBHelper helper) {
        this.helper = helper;
    }

Assim, na hora de utilizar seus DAOs você deve instanciar a classe que realiza a conexão e depois instanciar o seu DAO passando o objeto que realiza a conexão como parâmetro.

DBHelper helper = new DBHelper(this);
AlunoDAO alunoDAO = new AlunoDAO(helper);
ProvaDAO provaDAO = new ProvaDAO(helper);

Era exatamente essa minha Dúvida:

DBHelper helper = new DBHelper(this); <= AlunoDAO alunoDAO = new AlunoDAO(helper); ProvaDAO provaDAO = new ProvaDAO(helper);

Muito obrigado Romário!!!