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);