Erro estranho ao selecionar item de lista

Galera, tenho uma lista de Clientes e ao selecionar um cliente e mandar para tela de Vendas, está dando o seguinte erro:

09-20 16:13:29.983: E/Database(279): close() was never explicitly called on database '/data/data/com.br.aquavendas/databases/aqua.db’
09-20 16:13:29.983: E/Database(279): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
09-20 16:13:29.983: E/Database(279): at android.database.sqlite.SQLiteDatabase.(SQLiteDatabase.java:1810)
09-20 16:13:29.983: E/Database(279): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:817)
09-20 16:13:29.983: E/Database(279): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:851)
09-20 16:13:29.983: E/Database(279): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:844)
09-20 16:13:29.983: E/Database(279): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:540)
09-20 16:13:29.983: E/Database(279): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)
09-20 16:13:29.983: E/Database(279): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:158)
09-20 16:13:29.983: E/Database(279): at com.br.aquavendas.dao.ClienteDAO.getAll(ClienteDAO.java:105)
09-20 16:13:29.983: E/Database(279): at com.br.aquavendas.Listar.onResume(Listar.java:98)
09-20 16:13:29.983: E/Database(279): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1149)
09-20 16:13:29.983: E/Database(279): at android.app.Activity.performResume(Activity.java:3823)
09-20 16:13:29.983: E/Database(279): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3118)
09-20 16:13:29.983: E/Database(279): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3143)
09-20 16:13:29.983: E/Database(279): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2684)
09-20 16:13:29.983: E/Database(279): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
09-20 16:13:29.983: E/Database(279): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
09-20 16:13:29.983: E/Database(279): at android.os.Handler.dispatchMessage(Handler.java:99)
09-20 16:13:29.983: E/Database(279): at android.os.Looper.loop(Looper.java:123)
09-20 16:13:29.983: E/Database(279): at android.app.ActivityThread.main(ActivityThread.java:4627)
09-20 16:13:29.983: E/Database(279): at java.lang.reflect.Method.invokeNative(Native Method)
09-20 16:13:29.983: E/Database(279): at java.lang.reflect.Method.invoke(Method.java:521)
09-20 16:13:29.983: E/Database(279): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
09-20 16:13:29.983: E/Database(279): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
09-20 16:13:29.983: E/Database(279): at dalvik.system.NativeStart.main(Native Method)

O estranho é que está funcionando. Não tenho a mínima ideia de onde arruma isso. Poderiam me ajudar?

Cara, aparentemente é um problema de conexão com o banco de dados. Dê uma revisada no código

Não estou conseguindo identificar onde fecho o banco. Tenho as Classes: DAO, VO, ADAPTER e as demais classes que chamam essas citadas.

Alguém??

Onde teria que mexer? Não estou identificando o erro.

Posta teu codigo aqui cara, fica mais fácil :smiley:

Eu geralmente fecho o banco após realizar o que eu quero, aonde vai ser, depende do teu codigo.

Segue. DAO, Adapter e Listar

Listar Clientes

package com.br.aquavendas;

import java.util.List;

import com.br.aquavendas.adapters.ClienteAdapter;
import com.br.aquavendas.dao.ClienteDAO;
import com.br.aquavendas.vo.ClienteVO;

import android.app.Activity;
import android.app.ListActivity;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;

public class Listar extends Activity{
	
	ListView ltw;
	List<ClienteVO> lista = null;
	int idItem = 0;
	private static int MENU_EDITAR = 1;
	private static int MENU_APAGAR = 2;
	private static int MENU_VENDA  = 3;
	private EditText Procurar;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.listar);
		ltw = (ListView) findViewById(R.id.ltvDados);
		ltw.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
		
// Modo Filtro Lista - Início		
		Procurar = (EditText) findViewById(R.id.edtProcurar);
		Procurar.requestFocus();
		
		
		Procurar.addTextChangedListener(new TextWatcher() {
			
			@Override
			public void onTextChanged(CharSequence s, int start, int before, int count) {
			//	Chama método se digitar letra no campo edtProcurar
				filtrarLista();
				
			}
			
			@Override
			public void beforeTextChanged(CharSequence s, int start, int count,
					int after) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void afterTextChanged(Editable s) {
				// TODO Auto-generated method stub
				
			}
		});
// Modo Filtro Lista - Fim		
		
		
		final Button btnApagar = (Button) findViewById(R.id.btnApagar);
		
		registerForContextMenu(ltw);
		
		ltw.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
					long arg3) {
				btnApagar.setVisibility(0);
			//	Toast.makeText(getBaseContext(), "AQUI!", Toast.LENGTH_LONG).show();
			}
		});
		
	}
	
	
	@Override
	public void onResume(){
		super.onResume();
		ClienteDAO dao = new ClienteDAO(getBaseContext());
		lista = dao.getAll();
		ltw.setAdapter(new ClienteAdapter(getBaseContext(), lista));
	}
	
	public void Apagar_click(View v){
	
	}
	
	@Override
	public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo){
		AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
		menu.setHeaderTitle(lista.get(info.position).getContato());
		
		menu.add(Menu.NONE, MENU_EDITAR, 0, "Editar");
		menu.add(Menu.NONE, MENU_APAGAR, 0, "Apagar");
		menu.add(Menu.NONE, MENU_VENDA,  0, "Venda");
		
	}
	
	@Override
	public boolean onContextItemSelected(MenuItem item){
		AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo )item.getMenuInfo();
		
		idItem = lista.get(info.position).getId();
		
		if(item.getItemId() == MENU_EDITAR){
			Intent it = new Intent(getBaseContext(), EditarClientes.class);
			it.putExtra("codigo", idItem);
			startActivity(it);
		}else if(item.getItemId() == MENU_APAGAR){
			Builder msg = new Builder(Listar.this);
			msg.setMessage("Deseja excluir este cliente?");
			
			msg.setPositiveButton("Sim", new DialogInterface.OnClickListener() {
				
				@Override
				public void onClick(DialogInterface dialog, int which) {
					ClienteDAO dao = new ClienteDAO(getBaseContext());
					ClienteVO cliente = dao.getById(idItem);
					if(dao.delete(cliente) == true){
						Toast.makeText(getBaseContext(), "Excluído com sucesso!", Toast.LENGTH_LONG).show();
						ltw.setAdapter(new ClienteAdapter(getBaseContext(), dao.getAll()));
					}
				}
			});
			
			msg.setNegativeButton("Não", null);
			
			msg.show();
		}else if(item.getItemId() == MENU_VENDA){
			Intent it = new Intent(getBaseContext(), Vendas.class);
			it.putExtra("codigo", idItem);
			startActivity(it);
			finish();
//			Toast.makeText(getBaseContext(), "Venda em desenvolvimento, aguarde!", Toast.LENGTH_LONG).show();
		}
//		ClienteDAO dao = new ClienteDAO(getBaseContext());
//		dao.fecha_banco();
		return super.onContextItemSelected(item);
	}

// FILTRAR LISTA - COMEÇA AQUI
	
	// FILTRAR LISTVIEW AO DIGITAR LETRA NO CAMPO
	private void filtrarLista(){
		//	LISTAR TODOS OS CLIENTES COM FILTRO      
			carregarListaClientes_Filtro();

	}


	// Lista todos os clientes com nome, telefone e celular com o filtro
	private void carregarListaClientes_Filtro(){
	    ClienteDAO dao = new ClienteDAO(getBaseContext());
		String nomeString = Procurar.getText().toString();
		// Cursor cursor;	
		// dao.getClientePorNome(nomeString);
		// cursor.moveToFirst();
		//    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.mostrabanco, cursor, new String[] {SQLConstantes.KEY_RAZAOSOCIALNOME, SQLConstantes.KEY_CELULAR, SQLConstantes.KEY_EMAIL}, new int[] {R.id.lblCampo1,R.id.lblCampo2,R.id.lblCampo3});
		//SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.two_line_list_item, cursor, new String[] {SQLConstantes.KEY_NOME, SQLConstantes.KEY_CELULAR}, new int[] {android.R.id.text1, android.R.id.text2});
		// setListAdapter(adapter);
		ltw.setAdapter(new ClienteAdapter(getBaseContext(), dao.getClientePorNome(nomeString)));  
	}
	// FILTRAR LISTA - ACABA AQUI	
}

ClienteDAO

package com.br.aquavendas.dao;

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

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.br.aquavendas.banco.DB;
import com.br.aquavendas.vo.ClienteVO;

public class ClienteDAO {
	
	private static String table_name = "clientes";
	private static Context ctx;
	private static String[] columns = {"id", "razaosocial_nome", "nome_fantasia", "cnpj_cpf", "ie", "email", "contato", "endereco", "bairro", "cep", "cidade", "telefone", "celular", "data_cadastro"};
	
	public ClienteDAO(Context ctx){
		this.ctx = ctx;
	}
	
	public boolean insert(ClienteVO vo){
		SQLiteDatabase db = new DB(ctx).getWritableDatabase();
		
		ContentValues ctv = new ContentValues();
		ctv.put("razaosocial_nome", vo.getRazaosocial_nome());
		ctv.put("nome_fantasia", vo.getNome_fantasia());
		ctv.put("cnpj_cpf", vo.getCnpj_cpf());
		ctv.put("ie", vo.getIe());
		ctv.put("email", vo.getEmail());
		ctv.put("contato", vo.getContato());
		ctv.put("endereco", vo.getEndereco());
		ctv.put("bairro", vo.getBairro());
		ctv.put("cep", vo.getCep());
		ctv.put("cidade", vo.getCidade());
		ctv.put("telefone", vo.getTelefone());
		ctv.put("celular", vo.getCelular());
		ctv.put("data_cadastro", vo.getData_cadastro());
		
		return (db.insert(table_name, null, ctv) > 0);
		
	}
	
	public boolean delete(ClienteVO vo){
		SQLiteDatabase db = new DB(ctx).getWritableDatabase();
		
		return (db.delete(table_name, "id=?", new String[]{vo.getId().toString()}) > 0);
	}
	
	public boolean update(ClienteVO vo){
		SQLiteDatabase db = new DB(ctx).getWritableDatabase();
		
		ContentValues ctv = new ContentValues();
		ctv.put("razaosocial_nome", vo.getRazaosocial_nome());
		ctv.put("nome_fantasia", vo.getNome_fantasia());
		ctv.put("cnpj_cpf", vo.getCnpj_cpf());
		ctv.put("ie", vo.getIe());
		ctv.put("email", vo.getEmail());
		ctv.put("contato", vo.getContato());
		ctv.put("endereco", vo.getEndereco());
		ctv.put("bairro", vo.getBairro());
		ctv.put("cep", vo.getCep());
		ctv.put("cidade", vo.getCidade());
		ctv.put("telefone", vo.getTelefone());
		ctv.put("celular", vo.getCelular());
		ctv.put("data_cadastro", vo.getData_cadastro());
		
		return (db.update(table_name, ctv, "id=?", new String[]{vo.getId().toString()}) > 0);


	}
	
	public ClienteVO getById(Integer ID){
		SQLiteDatabase db = new DB(ctx).getReadableDatabase();
		
		Cursor rs = db.query(table_name, columns, "id=?", new String[]{ID.toString()}, null, null, null);
		
		ClienteVO vo = null;
		
		if(rs.moveToFirst()){
			vo = new ClienteVO();
			
			vo.setId(rs.getInt(rs.getColumnIndex("id")));
			vo.setRazaosocial_nome(rs.getString(rs.getColumnIndex("razaosocial_nome")));
			vo.setNome_fantasia(rs.getString(rs.getColumnIndex("nome_fantasia")));
			vo.setCnpj_cpf(rs.getString(rs.getColumnIndex("cnpj_cpf")));
			vo.setIe(rs.getString(rs.getColumnIndex("ie")));
			vo.setEmail(rs.getString(rs.getColumnIndex("email")));
			vo.setContato(rs.getString(rs.getColumnIndex("contato")));
			vo.setEndereco(rs.getString(rs.getColumnIndex("endereco")));
			vo.setBairro(rs.getString(rs.getColumnIndex("bairro")));
			vo.setCep(rs.getString(rs.getColumnIndex("cep")));
			vo.setCidade(rs.getString(rs.getColumnIndex("cidade")));
			vo.setTelefone(rs.getString(rs.getColumnIndex("telefone")));
			vo.setCelular(rs.getString(rs.getColumnIndex("celular")));
			vo.setData_cadastro(rs.getString(rs.getColumnIndex("data_cadastro")));
		}
		rs.close();
		return vo;
	}
	
	public List<ClienteVO> getAll(){
		SQLiteDatabase db = new DB(ctx).getReadableDatabase();
		
		Cursor rs = db.rawQuery("SELECT * FROM clientes", null);
		
		List<ClienteVO> lista = new ArrayList<ClienteVO>();
		while(rs.moveToNext()){
			ClienteVO vo = new ClienteVO(rs.getInt(rs.getColumnIndex("id")),rs.getString(rs.getColumnIndex("razaosocial_nome")),rs.getString(rs.getColumnIndex("nome_fantasia")),rs.getString(rs.getColumnIndex("cnpj_cpf")),rs.getString(rs.getColumnIndex("ie")),rs.getString(rs.getColumnIndex("email")),rs.getString(rs.getColumnIndex("contato")),rs.getString(rs.getColumnIndex("endereco")),rs.getString(rs.getColumnIndex("bairro")),rs.getString(rs.getColumnIndex("cep")),rs.getString(rs.getColumnIndex("cidade")),rs.getString(rs.getColumnIndex("telefone")),rs.getString(rs.getColumnIndex("celular")),rs.getString(rs.getColumnIndex("data_cadastro")));
			lista.add(vo);
		}
//		rs.close();
		return lista;
	}
	
	// CLIENTE POR NOME	
	public List<ClienteVO> getClientePorNome(String nomeString){
		SQLiteDatabase db = new DB(ctx).getReadableDatabase();
		String[] selectionArgs = {nomeString + "%"};  

		Cursor rs = db.rawQuery("SELECT * FROM clientes WHERE razaosocial_nome like ?", selectionArgs);
		
		List<ClienteVO> lista = new ArrayList<ClienteVO>();
		
		while (rs.moveToNext()) {
			ClienteVO vo = new ClienteVO(rs.getInt(rs.getColumnIndex("id")),rs.getString(rs.getColumnIndex("razaosocial_nome")),rs.getString(rs.getColumnIndex("nome_fantasia")),rs.getString(rs.getColumnIndex("cnpj_cpf")),rs.getString(rs.getColumnIndex("ie")),rs.getString(rs.getColumnIndex("email")),rs.getString(rs.getColumnIndex("contato")),rs.getString(rs.getColumnIndex("endereco")),rs.getString(rs.getColumnIndex("bairro")),rs.getString(rs.getColumnIndex("cep")),rs.getString(rs.getColumnIndex("cidade")),rs.getString(rs.getColumnIndex("telefone")),rs.getString(rs.getColumnIndex("celular")),rs.getString(rs.getColumnIndex("data_cadastro")));
			lista.add(vo);
		}
		return lista;
	}
	
	public void fecha_banco(){
		SQLiteDatabase db = new DB(ctx).getWritableDatabase();
		db.close();
	}

}

ClienteAdaptert

package com.br.aquavendas.adapters;

import java.util.List;

import com.br.aquavendas.vo.ClienteVO;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class ClienteAdapter extends BaseAdapter{

	private Context ctx;
	private List<ClienteVO> lista;
	
	public ClienteAdapter(Context ctx, List<ClienteVO> lista){
		this.ctx = ctx;
		this.lista = lista;
	}
	
	@Override
	public int getCount() {
		return lista.size();
	}

	@Override
	public Object getItem(int position) {
		return lista.get(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public View getView(int position, View view, ViewGroup viewGroup) {
		ClienteVO vo = (ClienteVO)getItem(position);
		
		LayoutInflater layout = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
		View v = layout.inflate(android.R.layout.simple_list_item_checked, null);

/*		
		TextView txtID = (TextView) v.findViewById(com.br.aquavendas.R.id.txtId);
		txtID.setText(vo.getId().toString());
*/	
		TextView txtContato = (TextView) v.findViewById(android.R.id.text1);
		txtContato.setText(vo.getContato());
		
		return v;
	}

}

kmunga, postei os códigos.

Alguém ajuda?

kmunga, me ajuda, postei o código ai.

Veio não tive tempo de olhar direito o codigo, to atulhado de trampo aqui, mas jah vou adiantando, tua classe Listar é quem deve controlar a classe DAO, tipo,

ClientDAO dao = new ClientDAO();
dao.insert(lista);
dao.fechar_banco();

Essa é a ideia, outro erro esta no metodo fechar_banco, aonde tu cria um novo banco e o fecha, sugiro tu abrir o teu banco de dados no construtor da classe ClientDAO e fechar o banco na classe Listar como mostrei, no medoto fechar_banco tu só fecha o banco db.close();

Ok, de boa, mas poderia mostrar mais especificamente como seria isso que disse? To perdido.

Em que parte da Listar colocaria isso que vc disse?

Agradeceria muito.

Esse é o método fecha_banco. O que tem que mudar nele?

	public void fecha_banco(){
		SQLiteDatabase db = new DB(ctx).getWritableDatabase();
		db.close();
	}

Não entendi direito o que fazer no fecha_banco.

Cara, a ideia do fecha_banco() seria fechar o banco que tu esta usando certo? Mas o que tu tá fazendo é criando um banco e o fechando em seguida e deixando o outro que tu estava usando em aberto. Por isso a mensagem de erro.

ficaria mais ou menos assim


public class ClienteDAO {

    private SQLiteDatabase db;
    
   //metodos

   public void fechar_banco(){
        db.close();
   }

tu pode usar tb

public class ClienteDAO extend SQLiteOpenHelper {

}

facilita tuda vida

kmunga, vou testar isso que falou e posto aqui o resultado, ok?

Obrigado por enquanto.

kmunga, tenho a classe DB que é onde cria o banco. O que posso fazer nela pra acabar com esse erro?

package com.br.aquavendas.banco;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;


public class DB extends SQLiteOpenHelper{

	private static String dbName = "aqua.db";
	private static String sql_cliente = "CREATE TABLE [clientes] ([id] integer primary key autoincrement, [razaosocial_nome] text, [nome_fantasia] text, [cnpj_cpf] text, [ie] text, [email] text, [contato] text, [endereco] text, [bairro] text, [cep] text, [cidade] text, [telefone] text, [celular] text, [data_cadastro] text);";	
	private static String sql_produto = "CREATE TABLE [produtos] ([id] integer primary key autoincrement, [linha] text, [produto] text, [embalagem] text, [valor_unitario] double(10,2), [valor_caixa] double(10,2), [tipo] text);";	
	private static String sql_venda  = "CREATE TABLE [vendas] ([id] integer primary key autoincrement, [data_venda] text, [id_cliente] text, [id_produto] text, [qtde] text, [unitario] text, [desconto] text, [total] text, [vendedor] text);";
	
	private static int version = 1;
	
	public DB(Context ctx) {
		super(ctx, dbName, null, version);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL(sql_cliente);
		db.execSQL(sql_produto);
		db.execSQL(sql_venda);
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
		
	}

}

kmunga onde na Lista eu coloco o db.close?

Nessa Classe está dando o mesmo erro:

Classe VendaDAO. Quando entro nessa tela da o erro.

package com.br.aquavendas.dao;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.br.aquavendas.banco.DB;
import com.br.aquavendas.vo.ProdutoVO;
import com.br.aquavendas.vo.VendaVO;

public class VendaDAO {
	
	private SQLiteDatabase db;
	private static String table_name = "vendas";
	private static Context ctx;
	private static String[] columns = {"id", "data_venda",  "id_cliente", "id_produto", "qtde", "unitario", "desconto", "total", "vendedor"};
	
	
	public VendaDAO(Context ctx){
		this.ctx = ctx;
	}
	
	public boolean insert(VendaVO vo){
		SQLiteDatabase db = new DB(ctx).getWritableDatabase();
		
		ContentValues ctv = new ContentValues();
		ctv.put("data_venda", vo.getData_Venda());
		ctv.put("id_cliente", vo.getId_Cliente());
		ctv.put("id_produto", vo.getId_Produto());
		ctv.put("qtde", vo.getQuantidade());
		ctv.put("unitario", vo.getValorUnitario());
		ctv.put("desconto", vo.getDesconto());
		ctv.put("total", vo.getValorTotal());
		ctv.put("vendedor", vo.getVendedor());
		
		return (db.insert(table_name, null, ctv) > 0);
		
	}
	
	public boolean delete(VendaVO vo){
		SQLiteDatabase db = new DB(ctx).getWritableDatabase();
		
		return (db.delete(table_name, "id=?", new String[]{vo.getId().toString()}) > 0);
	}
	
	public boolean update(VendaVO vo){
		SQLiteDatabase db = new DB(ctx).getWritableDatabase();
		
		ContentValues ctv = new ContentValues();
		ctv.put("data_venda", vo.getData_Venda());
		ctv.put("id_cliente", vo.getId_Cliente());
		ctv.put("id_produto", vo.getId_Produto());
		ctv.put("qtde", vo.getQuantidade());
		ctv.put("unitario", vo.getValorUnitario());
		ctv.put("desconto", vo.getDesconto());
		ctv.put("total", vo.getValorTotal());
		ctv.put("vendedor", vo.getVendedor());
		
		return (db.update(table_name, ctv, "id=?", new String[]{vo.getId().toString()}) > 0);


	}
	
	public VendaVO getById(Integer ID){
		SQLiteDatabase db = new DB(ctx).getReadableDatabase();
		
		Cursor rs = db.query(table_name, columns, "id=?", new String[]{ID.toString()}, null, null, null);
		
		VendaVO vo = null;
		
		if(rs.moveToFirst()){
			vo = new VendaVO();
			
			vo.setData_Venda(rs.getString(rs.getColumnIndex("data_venda")));
			vo.setId(rs.getInt(rs.getColumnIndex("id")));
			vo.setId_Cliente(rs.getString(rs.getColumnIndex("id_cliente")));
			vo.setId_Produto(rs.getString(rs.getColumnIndex("id_produto")));
			vo.setQuantidade(rs.getString(rs.getColumnIndex("qtde")));
			vo.setValorUnitario(rs.getString(rs.getColumnIndex("unitario")));
			vo.setDesconto(rs.getString(rs.getColumnIndex("desconto")));
			vo.setValorTotal(rs.getString(rs.getColumnIndex("total")));
			vo.setVendedor(rs.getString(rs.getColumnIndex("vendedor")));
		}
		rs.close();
		return vo;
	}
	
	public List<VendaVO> getAll(){
		SQLiteDatabase db = new DB(ctx).getReadableDatabase();
		
		Cursor rs = db.rawQuery("SELECT vendas.[data_venda], clientes.[id], clientes.contato,  produtos.[produto], vendas.[qtde], vendas.[unitario], vendas.[desconto], vendas.[total], vendas.[vendedor] FROM clientes INNER JOIN vendas ON vendas.[id_cliente]=clientes.[id] INNER JOIN produtos ON vendas.[id_produto]=produtos.id", null);
		 		

		List<VendaVO> lista_venda = new ArrayList<VendaVO>();
		while(rs.moveToNext()){
     	    VendaVO vo = new VendaVO(rs.getInt(rs.getColumnIndex("id")),rs.getString(rs.getColumnIndex("produto")),rs.getString(rs.getColumnIndex("contato")),rs.getString(rs.getColumnIndex("data_venda")),rs.getString(rs.getColumnIndex("qtde")),rs.getString(rs.getColumnIndex("unitario")),rs.getString(rs.getColumnIndex("desconto")),rs.getString(rs.getColumnIndex("total")),rs.getString(rs.getColumnIndex("vendedor")));

	        lista_venda.add(vo);
		}
		rs.close();
		return lista_venda;
	}
	
	public void fecha_banco(){
		db.close();
	}

}

kmunga, me ajuda, ta dando esse erro ainda.

email e gtalk:

frederico.brigatte@gmail.com

skype:
frederico.brigatte@itelefonica.com.br

Cara, coloca o getWritableDatabase() no onCreate() da classe DB.

Instancia o SQLiteDatabase na tua classe DAO, no construtor da tua DAO coloca

db = new DB(ctx);

A partir de agora tu usa o db para executar ações no teu banco de Dados, lembrando que se deve usar só o objeto db e não ficar criando novos a cada ação, no fecha_banco() é só o db.close();

Tua classe DB tá certa, só falta implementar o upgrade.

Posso te mandar pra vc ver como está, sem compromisso? To tentando aqui e ta trampo. Ai vc faz as mudanças que achar necessário, quando tiver tempo. Vou tentando fazer aqui o que disse, pode ser?