Erro na hora de gravar no banco

2 respostas
R

Bom dia galera,
Eu estou com um problema que eu já tentei de tudo mais não consegui, na hora que eu vou gravar no banco de dados aparece o seguinte erro no Logcat:

04-19 11:27:25.655: E/Database(224): Leak found
04-19 11:27:25.655: E/Database(224): java.lang.IllegalStateException: /data/data/br.com.afainformatica.cobrancapax/databases/cobrancapax.db SQLiteDatabase created and never closed
04-19 11:27:25.655: E/Database(224): at android.database.sqlite.SQLiteDatabase.(SQLiteDatabase.java:1694)

pelo que vocês podem ver é um erro que o banco foi criado mas nunca foi fechado, só que eu já fechei ele em monte de lugar mas continua dando o mesmo erro, eu vou colocar uma das minhas classes DAO para vocês verem qual é o possível problema:

package br.com.afainformatica.dao;

import java.util.ArrayList;
import java.util.List;

import br.com.afainformatica.cobrancapax.db;
import br.com.afainformatica.cobrancapax.vo.BairroVO;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;

public class BairroDAO {
    
//  private SQLiteDatabase db;
    //private db dbHelper;
     
    
    public static String table_name = "bairro";
    public static Context ctx;
    public static String[] columns = {"idbairro", "descricao", "idsetor"};
    
    public BairroDAO(Context ctx) {
        this.ctx = ctx;
//      dbHelper = new db(ctx);
    }
    
/*  public void fecharBanco(){
        dbHelper.close();
    }
    
    public void open() throws SQLException {
        db = dbHelper.getWritableDatabase();
    } */

    public boolean insert(BairroVO vo){
        SQLiteDatabase db = new db(ctx).getWritableDatabase();
        ContentValues ctv = new ContentValues();
        ctv.put("descricao", vo.getDescricao());
        ctv.put("idsetor", vo.getIdsetor());
        
        return (db.insert(table_name, null, ctv) > 0);
    }
    
    public boolean update(BairroVO vo){
        SQLiteDatabase db = new db(ctx).getWritableDatabase();
        ContentValues ctv = new ContentValues();
        ctv.put("idbairro", vo.getIdbairro());
        ctv.put("descricao", vo.getDescricao());
        ctv.put("idsetor", vo.getIdsetor());
        
        return(db.update(table_name, ctv, "idbairro=?", new String[]{vo.getIdbairro().toString()}) > 0);
    }

    public boolean delete(BairroVO vo){
        SQLiteDatabase db = new db(ctx).getWritableDatabase();
        return(db.delete(table_name, "idbairro=?", new String[]{vo.getIdbairro().toString()}) > 0);
    }
    
    public BairroVO getById(Integer ID){
        SQLiteDatabase db = new db(ctx).getReadableDatabase();
        
        Cursor rs = db.query(table_name, columns, "idbairro=?", new String[]{ID.toString()}, null, null, null);
        
        BairroVO vo = null;
        
        if (rs.moveToFirst()) {
            vo = new BairroVO();
            vo.setIdbairro(rs.getInt(rs.getColumnIndex("idbairro")));
            vo.setDescricao(rs.getString(rs.getColumnIndex("descricao")));
            vo.setIdsetor(rs.getInt(rs.getColumnIndex("idsetor")));
        }
    
        return vo;
    }
    
    public List<BairroVO> getAll() {
        SQLiteDatabase db = new db(ctx).getReadableDatabase();
        List<BairroVO> bairro = new ArrayList<BairroVO>();
        
        Cursor c = db.query(table_name, columns, null, null, null, null, null);
                
        while (c.moveToNext()) {
            BairroVO vo = new BairroVO();
            vo.setIdbairro(c.getInt(c.getColumnIndex("idbairro")));
            vo.setDescricao(c.getString(c.getColumnIndex("descricao")));
            vo.setIdsetor(c.getInt(c.getColumnIndex("idsetor")));
            
            bairro.add(vo);
        
        }
        
        return bairro;
    
    }

}

2 Respostas

leo.alvesneuwald

Opa,

So com o que tu colocou ai não tem como saber exatamente o problema, pois inicialmente a classe que fecha o DB tah até comentada.

Olha esse tutorial que explica bem como montar bem certinho:

http://www.androidbrasilprojetos.org/android/introducao-a-banco-de-dados-android/

Ah, e se pah fecha o DatabaseHelper e o SQLitedatabase tb.

Falou!

R

Fiz exatamente como no exemplo só que continua dando o mesmo erro, olha o jeito que eu deixei agora

package br.com.afainformatica.dao;

import java.util.ArrayList;
import java.util.List;

import br.com.afainformatica.cobrancapax.db;
import br.com.afainformatica.cobrancapax.vo.BairroVO;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;

public class BairroDAO {
	
	private SQLiteDatabase db;
	private db dbHelper;
	 
	
	public static String table_name = "bairro";
	public static Context ctx;
	public static String[] columns = {"idbairro", "descricao", "idsetor"};
	
	public BairroDAO(Context ctx) {
		this.ctx = ctx;
		dbHelper = new db(ctx);
	}
	
	public void fecharBanco(){
		dbHelper.close();
		db.close();
	}
	
//	public void open() throws SQLException {
//		db = dbHelper.getWritableDatabase();
//	} 

	public boolean insert(BairroVO vo){
//		SQLiteDatabase db = new db(ctx).getWritableDatabase();
		db = dbHelper.getWritableDatabase();
		
		ContentValues ctv = new ContentValues();
		ctv.put("descricao", vo.getDescricao());
		ctv.put("idsetor", vo.getIdsetor());
		
		return (db.insert(table_name, null, ctv) > 0);
	}
	
	public boolean update(BairroVO vo){
//		SQLiteDatabase db = new db(ctx).getWritableDatabase();
		db = dbHelper.getWritableDatabase();
		ContentValues ctv = new ContentValues();
		ctv.put("idbairro", vo.getIdbairro());
		ctv.put("descricao", vo.getDescricao());
		ctv.put("idsetor", vo.getIdsetor());
		
	    return(db.update(table_name, ctv, "idbairro=?", new String[]{vo.getIdbairro().toString()}) > 0);
	}

	public boolean delete(BairroVO vo){
//		SQLiteDatabase db = new db(ctx).getWritableDatabase();
		db = dbHelper.getWritableDatabase();
		return(db.delete(table_name, "idbairro=?", new String[]{vo.getIdbairro().toString()}) > 0);
	}
	
	public BairroVO getById(Integer ID){
//		SQLiteDatabase db = new db(ctx).getReadableDatabase();
		db = dbHelper.getReadableDatabase();
		
		Cursor rs = db.query(table_name, columns, "idbairro=?", new String[]{ID.toString()}, null, null, null);
		
		BairroVO vo = null;
		
		if (rs.moveToFirst()) {
			vo = new BairroVO();
			vo.setIdbairro(rs.getInt(rs.getColumnIndex("idbairro")));
			vo.setDescricao(rs.getString(rs.getColumnIndex("descricao")));
			vo.setIdsetor(rs.getInt(rs.getColumnIndex("idsetor")));
		}
		
		rs.close();
	
		return vo;
	}
	
	public List<BairroVO> getAll() {
//		SQLiteDatabase db = new db(ctx).getReadableDatabase();
		db = dbHelper.getReadableDatabase();
		List<BairroVO> bairro = new ArrayList<BairroVO>();
		
		Cursor c = db.query(table_name, columns, null, null, null, null, null);
				
		while (c.moveToNext()) {
			BairroVO vo = new BairroVO();
			vo.setIdbairro(c.getInt(c.getColumnIndex("idbairro")));
			vo.setDescricao(c.getString(c.getColumnIndex("descricao")));
			vo.setIdsetor(c.getInt(c.getColumnIndex("idsetor")));
			
			bairro.add(vo);
		
		}
		
		c.close();
		
		return bairro;
	
	}

}

Não sei se é assim, mas continua dando o mesmo erro.

Criado 20 de abril de 2012
Ultima resposta 23 de abr. de 2012
Respostas 2
Participantes 2