Ajuda com DAO

Pessoal, teria como melhorar esse código? Separar alguma parte em outro pacote? Tipo DAO?

package com.br.aquavendas.banco;
 
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
 
public class DbAdapter {
     
    private static final String DATABASE_NAME = "aqua";
    private static final int DATABASE_VERSION = 1;
     
    private static final String DATABASE_TABLE_CLIENTES = "clientes";
    private static final String DATABASE_TABLE_PRODUTOS = "produtos";
     
//  CAMPOS DA TABELA CLIENTES   
    public static final String KEY_IDCLI = "_id";
    public static final String KEY_RAZAOSOCIALNOME = "razaosocial_nome";
    public static final String KEY_NOMEFANTASIA = "nome_fantasia";
    public static final String KEY_CNPJCPF = "cnpj_cpf";
    public static final String KEY_IE = "ie";
    public static final String KEY_EMAIL = "email";
    public static final String KEY_CONTATO = "contato";
    public static final String KEY_ENDERECO = "endereco";
    public static final String KEY_BAIRRO = "bairro";
    public static final String KEY_CEP = "cep";
    public static final String KEY_CIDADE = "cidade";
    public static final String KEY_TELEFONE = "telefone";
    public static final String KEY_CELULAR = "celular";
    public static final String KEY_DATACADASTRO = "data_cadastro";
     
//  CAMPOS DA TABELA PRODUTOS
    public static final String KEY_IDPRO = "_id";
    public static final String KEY_LINHA = "linha";
    public static final String KEY_PRODUTO = "produto";
    public static final String KEY_EMBALAGEM = "embalagem";
    public static final String KEY_VALORUNITARIO = "valor_unitario";
    public static final String KEY_VALORCAIXA = "valor_caixa";
    public static final String KEY_TIPO = "tipo";
     
//  CRIA A TABELA CLIENTES
    private static final String DATABASE_CREATE_CLIENTES = "create table " + DATABASE_TABLE_CLIENTES + " ("
    + KEY_IDCLI + " integer primary key autoincrement, "
    + KEY_RAZAOSOCIALNOME + " text, "
    + KEY_NOMEFANTASIA + " text, "
    + KEY_CNPJCPF + " text, "
    + KEY_IE + " text, "
    + KEY_EMAIL + " text, "
    + KEY_CONTATO + " text, "
    + KEY_ENDERECO + " text, "
    + KEY_BAIRRO + " text, "
    + KEY_CEP + " text, "
    + KEY_CIDADE + " text, "
    + KEY_TELEFONE + " text, "
    + KEY_CELULAR + " text, "
    + KEY_DATACADASTRO + " text);";
     
//  CRIA A TABELA PRODUTOS
    private static final String DATABASE_CREATE_PRODUTOS = "create table " + DATABASE_TABLE_PRODUTOS + " ("
    + KEY_IDPRO + " integer primary key autoincrement, "
    + KEY_LINHA + " text, "
    + KEY_PRODUTO + " text, "
    + KEY_EMBALAGEM + " text, "
    + KEY_VALORUNITARIO + " double(10,2), "
    + KEY_VALORCAIXA + " double(10,2), "
    + KEY_TIPO + " text);";
 
         
    private final Context mCtx;
     
    private DatabaseHelper mDbHelper;
    private SQLiteDatabase mDb;
     
    public DbAdapter(Context ctx){
        this.mCtx = ctx;
    }
     
    public DbAdapter open() throws SQLiteException{
        if(isClosed()){
            mDbHelper = new DatabaseHelper(mCtx);
            mDb = mDbHelper.getWritableDatabase();
        }
        return this;
    }
     
    public void close(){
        mDbHelper.close();
    }
     
    public boolean isClosed(){
        return mDb == null || !mDb.isOpen();
    }
     
// TABELA CLIENTES
     
//  GRAVAR CLIENTE
    public long gravarCliente(String razaosocial_nome, String cnpj_cpf, String ie, String nome_fantasia, String data_cadastro, String email, String contato, String endereco, String bairro, String cep, String cidade, String telefone, String celular){
        ContentValues valores = new ContentValues();
        valores.put(KEY_RAZAOSOCIALNOME, razaosocial_nome);
        valores.put(KEY_NOMEFANTASIA, nome_fantasia);
        valores.put(KEY_CNPJCPF, cnpj_cpf);
        valores.put(KEY_IE, ie);
        valores.put(KEY_EMAIL, email);
        valores.put(KEY_CONTATO, contato);
        valores.put(KEY_ENDERECO, endereco);
        valores.put(KEY_BAIRRO, bairro);
        valores.put(KEY_CEP, cep);
        valores.put(KEY_CIDADE, cidade);
        valores.put(KEY_TELEFONE, telefone);
        valores.put(KEY_CELULAR, celular);
        valores.put(KEY_DATACADASTRO, data_cadastro);
 
        return mDb.insert(DATABASE_TABLE_CLIENTES, null, valores);
    }
 
//  ALTERAR CLIENTE
    public boolean atualizarCliente(long Id, String razaosocial_nome, String cnpj_cpf, String ie, String nome_fantasia, String data_cadastro, String email, String contato, String endereco, String bairro, String cep, String cidade, String telefone, String celular){
        ContentValues valores = new ContentValues();
        valores.put(KEY_RAZAOSOCIALNOME, razaosocial_nome);
        valores.put(KEY_NOMEFANTASIA, nome_fantasia);
        valores.put(KEY_CNPJCPF, cnpj_cpf);
        valores.put(KEY_IE, ie);
        valores.put(KEY_EMAIL, email);
        valores.put(KEY_CONTATO, contato);
        valores.put(KEY_ENDERECO, endereco);
        valores.put(KEY_BAIRRO, bairro);
        valores.put(KEY_CEP, cep);
        valores.put(KEY_CIDADE, cidade);
        valores.put(KEY_TELEFONE, telefone);
        valores.put(KEY_CELULAR, celular);
        valores.put(KEY_DATACADASTRO, data_cadastro);
 
        return mDb.update(DATABASE_TABLE_CLIENTES, valores, KEY_IDCLI + "=" + Id, null) > 0;
    }
 
//  APAGAR CLIENTE
    public boolean apagarCliente(long Id){
        int qt = mDb.delete(DATABASE_TABLE_CLIENTES, KEY_IDCLI + "=" + Id, null);
        return qt > 0;
    }
     
 
// CONSULTAS    
     
//  TODOS OS CLIENTES   
    public Cursor getTodosClientes(){
        return mDb.query(DATABASE_TABLE_CLIENTES, null, null, null, null, null, null);
    }
     
// CLIENTE POR ID   
    public Cursor getCliente(long Id){
        return mDb.query(DATABASE_TABLE_CLIENTES, null, KEY_IDCLI + "=" + Id, null, null, null, null);
    }
     
// CLIENTE POR NOME 
    public Cursor getClientePorNome(String nomeString){
        String[] selectionArgs = {nomeString + "%"};  
//      return mDb.query(DATABASE_TABLE_CLIENTES, null, KEY_NOME + "=" + selectionArgs, null, null, null, null);
        return mDb.rawQuery("SELECT * FROM clientes WHERE razaosocial_nome like ?", selectionArgs);
    }
     
    private class DatabaseHelper extends SQLiteOpenHelper{
 
        public DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }
 
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(DATABASE_CREATE_CLIENTES);
            db.execSQL(DATABASE_CREATE_PRODUTOS);
        }
 
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        }
         
    }
     
}

Já pensou em criar pelo menos uma classe Cliente pra não ter que ficar mandando tantos atributos pros métodos de salvar e alterar?

Rodrigo, como que seria? Estou tentando e não estou conseguindo. Poderia me ajudar?

Ao invés de ter um método assim:public boolean atualizarCliente(long Id, String razaosocial_nome, String cnpj_cpf, String ie, String nome_fantasia, String data_cadastro, String email, String contato, String endereco, String bairro, String cep, String cidade, String telefone, String celular){ ContentValues valores = new ContentValues(); valores.put(KEY_RAZAOSOCIALNOME, razaosocial_nome); valores.put(KEY_NOMEFANTASIA, nome_fantasia); valores.put(KEY_CNPJCPF, cnpj_cpf); valores.put(KEY_IE, ie); valores.put(KEY_EMAIL, email); valores.put(KEY_CONTATO, contato); valores.put(KEY_ENDERECO, endereco); valores.put(KEY_BAIRRO, bairro); valores.put(KEY_CEP, cep); valores.put(KEY_CIDADE, cidade); valores.put(KEY_TELEFONE, telefone); valores.put(KEY_CELULAR, celular); valores.put(KEY_DATACADASTRO, data_cadastro); return mDb.update(DATABASE_TABLE_CLIENTES, valores, KEY_IDCLI + "=" + Id, null) > 0; } Você teria um assim:[code]public boolean atualizarCliente(Cliente cliente){
ContentValues valores = new ContentValues();
valores.put(KEY_RAZAOSOCIALNOME, cliente.getRazaoSocial());
valores.put(KEY_NOMEFANTASIA, cliente.getNomeFantasia());

// Outros atributos

return mDb.update(DATABASE_TABLE_CLIENTES, valores, KEY_IDCLI + "=" + Id, null) > 0;  

} [/code]Assim caso tenha que alterar atributos, a assinatura do método não é afetada

Seria utilizar get e set? Uma classe utilizando isso? Se for, como seria?

Isso, veja que eu estou recuperando os atributos da classe com métodos get

E como que seria montar essa classe?

É uma classe normal. não estou entendendo sua pergunta. algo assim:[code]public class Cliente{

private String nomeFantasia;
// outros atributos

public String getNomeFantasia(){
    return nomeFantasia;
}

public void setNomeFantasia(String nomeFantasia){
    this.nomeFantasia = nomeFantasia;
}

 // Outros getters e setters

}[/code]

Minha dúvida era como montar essa Classe. É só pegar os atributos da tabela e gerar os get e set? Ai faria isso pra cada tabela do banco?

Ah tá, é isso mesmo, lembrando que é só uma sugestão. Eu não sei se Android tem algum padrão melhor pra acesso a dados, minha experiência com a plataforma não é tão extensa :slight_smile:

Sim ele aceita isso sim. Mas poderia separar o crud num DAO por exemplo? Deixar uma classe que cria o banco, outra o CRUD e outra os Get e Set? Com esse modelo ai?

Oi Rodrigo, me ajuda ai, tá quase acabando a dúvida.

Sim, você pode ter uma classe só para o DAO, não tem problema nenhum.

Então o problema é montar o DAO, rs. Pode me ajudar?

O DbAdapter já me parece ser um DAO, o que exatamente você quer fazer?

Queria separar a criação do banco e o CRUD, o insert, update, entendeu? Uma classe pra cada. Entendeu o que quero fazer?

Tem como separar isso?

A primeira coisa que você precisa fazer é seguir o que o Rodrigo disse, eliminando assim todas aquelas variáveis e os parâmetros da classe.
A segunda é estudar agregação e composição. Você pode criar uma classe ConnectorUtil e colocar todos os métodos inerentes ao gerenciamento da conexão com o banco de dados, deixando a responsabilidade da classe DbAdapter como sendo apenas interagir com o banco (ou seja, realizar as operações de CRUD).
Não dá para falar muito mais sobre isso sem intervir no código. Qualquer intervenção seria inútil se você não estudar esses conceitos primeiro.

Então, queria uma ajuda para separar isso. A outra classe tá tranquilo de fazer, é essa mesmo que ta dando um trampo.

Repito o que eu disse, estude composição e agregação. Sem entender esses conceitos, você não vai evoluir muito não.