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

DAO não cria a tabela

O que esta acontecendo e o seguinte: Criei um ClienteDAO e um ProdutoDAO da forma como no curso, só que quando rodo a app se usar primeiro qualquer um dos DAOs ele cria a tabela normal, mas dai quando vou na outra parte do aplicativo para criar a segunda tabela ele não cria a segunda tabela e recebo uma exception.

E/SQLiteLog: (1) no such table: produto D/AndroidRuntime: Shutting down VM E/AndroidRuntime: FATAL EXCEPTION: main Process: br.com.jwebsofdesign.programaEstudos, PID: 4164 java.lang.RuntimeException:

public class ClienteDAO extends SQLiteOpenHelper {


    public ClienteDAO(Context context) { super(context, "hairconnection", null, 1); }

    @Override
    public void onCreate(SQLiteDatabase dataBase) {
        String sql = "CREATE TABLE cliente " +
                "(id_cli INTEGER PRIMARY KEY, nome_cli TEXT NOT NULL, endereco_cli TEXT, telefone_cli TEXT, email_cli TEXT, nascimento_cli DATE, foto_cli TEXT);";
        dataBase.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase dataBase, int i, int i1) {
        String sql = "DROP TABLE IF EXISTS cliente";
        dataBase.execSQL(sql);
        onCreate(dataBase);
    }
    // Resto do codigo do dao
}
4 respostas

Fera o erro esta dizendo que não tem nenhuma tabela do tipo produto

Exatamente, mas porque isso esta acontecendo ? Quando cadastro primeiro o produto ele cria a tabela normal, ai quando vou criar um cliente ele diz que não foi criado a tabela cliente, removo a app e rodo novamente, cadastrando o cliente ele cria a tabela normal e tudo fica funcionando, ai quando vou cadastrar o produto ai ele diz que a tabela produto não foi criada.

solução!

Veja só a classe ClienteDAO está herdando de SQLiteOpenHelper.

Com isto vc pode usar os métodos onCreate e onUpdate. Mas o método onCreate é pra ser usado apenas quando vc chama o Banco de Dados pela primeira vez.

No Caso vc tem de criar uma classe:

class BancoDeDados extends SQLiteOpenHelper {

private static final String NOME_BANCO = "banco.db"; private static final int VERSAO = 1;

public CriaBancoDeDados(Context context){ super(context, NOME_BANCO,null,VERSAO); }

@Override public void onCreate(SQLiteDatabase dataBase) { String sqlCreateCliente = "CREATE TABLE cliente " + "(id_cli INTEGER PRIMARY KEY, nome_cli TEXT NOT NULL, endereco_cli TEXT, telefone_cli TEXT, email_cli TEXT, nascimento_cli DATE, foto_cli TEXT);"; dataBase.execSQL(sql);"

String sqlCreateProduto = "CREATE TABLE produto " + "(id_cli INTEGER PRIMARY KEY, nome_pro TEXT NOT NULL);" dataBase.execSQL(sqlCreateCliente); dataBase.execSQL(sqlCreateProduto); }

}

nisto vc pode criar uma class abstrata que retorne apenas uma instancia do banco de dados

public abstract Controller{ private CriaBancoDeDados banco;

public getInstanceOfBanco(Context context){ if(banco == null){ this.banco = new CriaBancoDeDados(context); return this.banco; } else { return this.banco; } }

}

No DaoProduto por exemplo vc deve fazer o seguinte

public class DaoProduto{

private SQLiteDatabase db; private CriaBancoDeDados banco; public DaoProduto(Context context){ banco = Controller.getInstanceOfBanco(context); }

public insereProduto(Produto produto) { ContentValues valores; db = banco.getWritableDatabase(); valores = new ContentValues(); ... ... ...

Continua com a tua implementacao } } }

Na tua activity vc usa para produto

DaoProduto daoProduto = new DaoProduto(getBaseContext());

daoProduto.insereProduto()

para Cliente

DaoCliente daoCliente = new DaoCliente(getBaseContext()); daoCliente.insereCliente()

Acho que assim esta explicado, o código não foi bem feito pq fiz direto no navegador e sem ide mas foi só pra vc ter uma ideia.

Muito obrigado Luiz Carlos, fiz algo mais simples aproveitando a sua ideia.

criei uma classe BancoDeDadosDAO e simplesmente estendi os daos a elas, funcionou perfeitamente.

public class BancoDeDadosDAO extends SQLiteOpenHelper {

    public BancoDeDadosDAO(Context context) { super(context, "hairconnection", null, 1); }

    @Override
    public void onCreate(SQLiteDatabase dataBase) {
        String tabelaCliente = "CREATE TABLE cliente " +
                "(id_cli INTEGER PRIMARY KEY, nome_cli TEXT NOT NULL, endereco_cli TEXT, telefone_cli TEXT, email_cli TEXT, nascimento_cli DATE, foto_cli TEXT);";
        dataBase.execSQL(tabelaCliente);

        String tabelaProfissional = "CREATE TABLE profissional " +
                "(id_prof INTEGER PRIMARY KEY, nome_prof TEXT NOT NULL, endereco_prof TEXT, telefone_prof TEXT, funcao_prof TEXT, foto_prof TEXT);";
        dataBase.execSQL(tabelaProfissional);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
}

e as filhas ficaram assim

public class ClienteDAO extends BancoDeDadosDAO {

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

    public List<Cliente> listarClientes() {
        String sql = "Select id_cli, nome_cli, endereco_cli, telefone_cli, email_cli, nascimento_cli, foto_cli from cliente;";
        SQLiteDatabase db = getReadableDatabase();
        Cursor c = db.rawQuery(sql, null);

        List<Cliente> lista = new ArrayList<>();
        while (c.moveToNext()) {
            Cliente cliente = new Cliente();
            cliente.setId(c.getLong(c.getColumnIndex("id_cli")));
            cliente.setNome(c.getString(c.getColumnIndex("nome_cli")));
            cliente.setEndereco(c.getString(c.getColumnIndex("endereco_cli")));
            cliente.setTelefone(c.getString(c.getColumnIndex("telefone_cli")));
            cliente.setEmail(c.getString(c.getColumnIndex("email_cli")));
            cliente.setNascimento(new DataHelper().stringParaData(c.getString(c.getColumnIndex("nascimento_cli"))));
            cliente.setFoto(c.getString(c.getColumnIndex("foto_cli")));
            lista.add(cliente);
        }

        c.close();
        return lista;
    }

    public void adicionar(Cliente cliente){
        SQLiteDatabase db = getWritableDatabase();
        ContentValues dados = pegaOsDadosDoCliente(cliente);
        db.insert("cliente", null, dados);

    }

    public void deletar(Cliente cliente) {
        SQLiteDatabase db = getWritableDatabase();
        String[] params = {cliente.getId().toString()};
        db.delete("cliente", "id_cli = ?", params);
    }

    public void editar(Cliente cliente) {
        SQLiteDatabase db = getWritableDatabase();
        ContentValues dados = pegaOsDadosDoCliente(cliente);
        String[] params = {cliente.getId().toString()};
        db.update("cliente", dados, "id_cli = ?", params);
    }

    @NonNull
    private ContentValues pegaOsDadosDoCliente(Cliente cliente) {
        ContentValues dados = new ContentValues();
        dados.put("nome_cli", cliente.getNome());
        dados.put("endereco_cli", cliente.getEndereco());
        dados.put("telefone_cli", cliente.getTelefone());
        dados.put("email_cli", cliente.getEmail());
        dados.put("nascimento_cli", String.valueOf(cliente.getNascimento().getTime()));
        dados.put("foto_cli", cliente.getFoto());
        return dados;
    }
}