Erro estranho ao selecionar item de lista

79 respostas
F

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?

79 Respostas

G

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

F

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

F

Alguém??

F

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

K

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.

F

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

}
F

kmunga, postei os códigos.

F

Alguém ajuda?

F

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

K

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

F

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.

K

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

F

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

Obrigado por enquanto.

F

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
		
	}

}
F

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

}
F

kmunga, me ajuda, ta dando esse erro ainda.

F

email e gtalk:

[email removido]

skype:
[email removido]

K

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.

F

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?

F

Seria essa linha:

SQLiteDatabase db = new DB(ctx).getWritableDatabase();

Colocar ela na Classe DB, certo?

K

Até pode veio, mas sabe-se lá deus quando vou conseguir fazer.

K
fbrigatt:
Seria essa linha:
SQLiteDatabase db = new DB(ctx).getWritableDatabase();

Colocar ela na Classe DB, certo?

Não veio, o getWritableDatabase() tu coloca no onCreate() da tua classe DB.

no construtor do teu DAO

db = new DB(ctx);

Instancia o teu db

[code]
private SQLiteDatabase db;
[code]

Entendeu? fazendo isso, tu iria usar o db instanciado em qualquer dos teus métodos, sem a necessidade de criar um novo objeto para cada ação.

F

Vou postando aqui o que to fazendo então, ai vc vai vendo, é melhor?

Seria isso: Classe DB

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 SQLiteDatabase db;
	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);
		
		SQLiteDatabase db = new DB(ctx).getWritableDatabase();
	}

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

}
K

to tri atucanado aqui, te passei a classe DB errada

fbrigatt:
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
		
	}

       public SQLiteDatabase getDatabase(){
             return this.getWritableDatabase();
       }

}

ai no construtor da tua classe dao

DB banco =new DB(ctx);
db = banco.getDatabase();

Sobre fechar o banco, pense assim, tua aplicação precisa carregar uma lista de usuarios que estão em teu banco o que tu faz?

1 - Abre o banco (ou cria caso nao exista);
2 - Faz a operação, no caso, retorna uma lista com os usuarios cadastrados;
3 - Fecha o banco;

cada ação da tua aplicação deve obedecer essa logica.

F

Ta dando esse erro:

db.getWritableDatabase(); The method getWritableDatabase() is undefined for the type SQLiteDatabase

Classe DB

F

Não to entendendo onde tem que fechar o banco nas Classes DAO, me ajuda.

K

De uma olhada no ultimo post editado

F

Seria o que vc disse:

“to tri atucanado aqui, te passei a classe DB errada”, rs?

K

fbrigatt:
Seria o que vc disse:

“to tri atucanado aqui, te passei a classe DB errada”, rs?

Esse mesmo, mas acho que agora vai funcionar, se tu pensar naquela logica tu deve resolver a questão.

Eu to tri atucanado aqui no trampo, pra ti ter uma ideia, era pra ter dado um citar e acabei editando o topico.

F

De boa, vc tem skype ou gtalk?

K

eu não posso usar aqui no meu serviço, mas vamos teclando por aqui mesmo, mais pessoas podem ver e tentar ajudar.

F

Tudo bem, é pra contato mesmo, podemos ficar aqui, tudo bem.

F

kmunga,

Faltou te perguntar como seria para fechar o banco nas Classes.

db.close();

Seria isso? Em que parte do código colocaria essa linha se fosse isso?

Essa linha nas Classes DAO eu tiro?

SQLiteDatabase db = new DB(ctx).getWritableDatabase();

E coloco isso:

DB banco =new DB(ctx);  
db = banco.getDatabase();
K

fbrigatt:
kmunga,

Faltou te perguntar como seria para fechar o banco nas Classes.

db.close();

Seria isso? Em que parte do código colocaria essa linha se fosse isso?

Pense naquilo que te disse, por exemplo no trecho que tu deletou um determinado usuario

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())); dao.fecha_banco(); }

Entendeu, tu abriu o dao (e o banco), fez as operações que queria e então mandou o dao fechar o banco, pois não esta mais sendo usado.

K

fbrigatt:
kmunga,

Essa linha nas Classes DAO eu tiro?

SQLiteDatabase db = new DB(ctx).getWritableDatabase();

E coloco isso:

DB banco =new DB(ctx); db = banco.getDatabase();

Cara, tu cria o teu banco de dados no construtor do DAO, ai tu remove todas os SQLiteDatabase db = new DB(ctx).getWritableDatabase(); demais do teu codigo, pois não sao mais necessarios.

No dado tu vai manipular tuas informações apenas com o objeto criado, o db, não necessitando criar novos novamente.

F

Então na Classe DB coloco isso:

public SQLiteDatabase getDatabase(){  
             return this.getWritableDatabase();  
       }

E onde tem essa linha nas Classes DAO eu tiro:

SQLiteDatabase db = new DB(ctx).getWritableDatabase();

E coloco isso no Construtor:

DB banco =new DB(ctx);    
db = banco.getDatabase();

Que seria aqui:

public ClienteDAO(Context ctx){
		this.ctx = ctx;
}
K

Perfeito, é isso ai, caso consiga resolver teu problema, coloca RESOLVIDO no topico pra saber que já tá tudo ok :smiley:

F

Vou fazer o que disse e posto o resultado.

F

kmunga, tira essa linha também:

public class ClienteDAO {
	
	private SQLiteDatabase db; // Essa aqui
	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"};
F

Nesse caso aqui como ficaria:

public boolean delete(ClienteVO vo){
		SQLiteDatabase db = new DB(ctx).getWritableDatabase(); // Exclui essa linha também?
		
		return (db.delete(table_name, "id=?", new String[]{vo.getId().toString()}) > 0);
	}
F

kmunga

Fiz um cadastro de teste e cliquei no botão para listar e deu isso no LogCat:

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

kmunga,

Viu ai, deu o erro novamente.

F

Na minha classe DAO, tem o metodo fecha_banco(). Minha dúvida é:

Eu dou db.close() na classe DAO ou na classe que Cadastra ou Edita?

Esse código é o que ta no botão Salvar da Classe CadastrarCliente

Salvar = (Button) findViewById(R.id.btnSalvar);

		Salvar.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				
				ClienteVO vo = new ClienteVO();
				vo.setRazaosocial_nome(RazaoSocialNome.getText().toString());
				vo.setNome_fantasia(NomeFantasia.getText().toString());
				vo.setCnpj_cpf(CnpjCpf.getText().toString());
				vo.setIe(IE.getText().toString());
				vo.setEmail(Email.getText().toString());
				vo.setContato(NomeContato.getText().toString());
				vo.setEndereco(Endereco.getText().toString());
				vo.setBairro(Bairro.getText().toString());
				vo.setCep(CEP.getText().toString());
				vo.setCidade(Cidade.getText().toString());
				vo.setTelefone(Telefone.getText().toString());
				vo.setCelular(Celular.getText().toString());
				vo.setData_cadastro(DataCadastro.getText().toString());
				
				ClienteDAO dao = new ClienteDAO(getBaseContext());
				if(dao.insert(vo)){
					Toast.makeText(getBaseContext(), "Sucesso na gravação!", Toast.LENGTH_LONG).show();
					dao.fecha_banco();
					finish();
				}
			}
		});

Minha Classe 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 SQLiteDatabase db;
	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;
		
		DB banco =new DB(ctx);      
		db = banco.getDatabase();  
		
	}
	
	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);
		}
		rs.close();
		return lista;
	}
	
	public void fecha_banco(){
		if (db != null)
		    db.close();
	}

}
K

Cara,na classe DAO tu segue criando um novo banco para executar tuas operações

public List&lt;ClienteVO&gt; getAll(){  
       // retire essa linha  SQLiteDatabase db = new DB(ctx).getReadableDatabase();  
          
        Cursor rs = db.rawQuery("SELECT * FROM clientes", null);  
          
        List&lt;ClienteVO&gt; lista = new ArrayList&lt;ClienteVO&gt;();  
        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&lt;ClienteVO&gt; getClientePorNome(String nomeString){  
        // retire essa linha SQLiteDatabase db = new DB(ctx).getReadableDatabase();  
        String[] selectionArgs = {nomeString + "%"};    
  
        Cursor rs = db.rawQuery("SELECT * FROM clientes WHERE razaosocial_nome like ?", selectionArgs);  
          
        List&lt;ClienteVO&gt; lista = new ArrayList&lt;ClienteVO&gt;();  
          
        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;  
    }
F

Isso que vc postou é pra arrumar la?

K

deve arrumar, pelo menos a questão do close, senão resolver eu já não sei mais :confused:

F

Ok, estou fazendo. Ai faço em todas as DAO que tiver, certo?

K

Cara, tu cria um banco de dados no construtor e usa ele em toda a classe. Pelo que eu vi, só tinha faltado aquelas duas linhas que eu comentei.

F

Então, é que outras classes quase iguais a essa.

Ficou assim:

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 SQLiteDatabase db;
	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;
		
		DB banco =new DB(ctx);      
		db = banco.getDatabase();  
		
	}
	
	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);
		}
		rs.close();
		return lista;
	}
	
	public void fecha_banco(){
		if (db != null)
		    db.close();
	}

}
F

No meu CadastroCliente.java no botão Salvar fiz assim:

Salvar.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				
				ClienteVO vo = new ClienteVO();
				vo.setRazaosocial_nome(RazaoSocialNome.getText().toString());
				vo.setNome_fantasia(NomeFantasia.getText().toString());
				vo.setCnpj_cpf(CnpjCpf.getText().toString());
				vo.setIe(IE.getText().toString());
				vo.setEmail(Email.getText().toString());
				vo.setContato(NomeContato.getText().toString());
				vo.setEndereco(Endereco.getText().toString());
				vo.setBairro(Bairro.getText().toString());
				vo.setCep(CEP.getText().toString());
				vo.setCidade(Cidade.getText().toString());
				vo.setTelefone(Telefone.getText().toString());
				vo.setCelular(Celular.getText().toString());
				vo.setData_cadastro(DataCadastro.getText().toString());
				
				ClienteDAO dao = new ClienteDAO(getBaseContext());
				if(dao.insert(vo)){
					Toast.makeText(getBaseContext(), "Sucesso na gravação!", Toast.LENGTH_LONG).show();
					dao.fecha_banco();
					finish();
				}
			}
		});

Ta certo? Fecho na Classe que ta Gravando ou Editando. Certo? Não no DAO.

F

Cara fiz assim:

1º Listei os clientes;

2º Selecionei um da lista e dei um click longo e escolhi editar;

3º Fiz a edição e Atualizei.

4º Cliquei no Botão Voltar do Emulador, não da minha aplicação e:
10-11 15:12:43.500: E/Database(279): close() was never explicitly called on database '/data/data/com.br.aquavendas/databases/aqua.db' 
10-11 15:12:43.500: E/Database(279): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
10-11 15:12:43.500: E/Database(279): 	at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1810)
10-11 15:12:43.500: E/Database(279): 	at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:817)
10-11 15:12:43.500: E/Database(279): 	at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:851)
10-11 15:12:43.500: E/Database(279): 	at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:844)
10-11 15:12:43.500: E/Database(279): 	at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:540)
10-11 15:12:43.500: E/Database(279): 	at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)
10-11 15:12:43.500: E/Database(279): 	at com.br.aquavendas.banco.DB.getDatabase(DB.java:35)
10-11 15:12:43.500: E/Database(279): 	at com.br.aquavendas.dao.ClienteDAO.<init>(ClienteDAO.java:25)
10-11 15:12:43.500: E/Database(279): 	at com.br.aquavendas.Listar.onResume(Listar.java:97)
10-11 15:12:43.500: E/Database(279): 	at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1149)
10-11 15:12:43.500: E/Database(279): 	at android.app.Activity.performResume(Activity.java:3823)
10-11 15:12:43.500: E/Database(279): 	at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3118)
10-11 15:12:43.500: E/Database(279): 	at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3143)
10-11 15:12:43.500: E/Database(279): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2684)
10-11 15:12:43.500: E/Database(279): 	at android.app.ActivityThread.access$2300(ActivityThread.java:125)
10-11 15:12:43.500: E/Database(279): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
10-11 15:12:43.500: E/Database(279): 	at android.os.Handler.dispatchMessage(Handler.java:99)
10-11 15:12:43.500: E/Database(279): 	at android.os.Looper.loop(Looper.java:123)
10-11 15:12:43.500: E/Database(279): 	at android.app.ActivityThread.main(ActivityThread.java:4627)
10-11 15:12:43.500: E/Database(279): 	at java.lang.reflect.Method.invokeNative(Native Method)
10-11 15:12:43.500: E/Database(279): 	at java.lang.reflect.Method.invoke(Method.java:521)
10-11 15:12:43.500: E/Database(279): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
10-11 15:12:43.500: E/Database(279): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
10-11 15:12:43.500: E/Database(279): 	at dalvik.system.NativeStart.main(Native Method)

Pera um poko, na Classe Editar não dei dao.fecha_banco();

F

Classe EditarCliente ta assim:

package com.br.aquavendas;

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

import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class EditarClientes extends Activity { // Início da Classe EditarClientes
	private int ID = 0; 
	private EditText Id, RazaoSocialNome, NomeFantasia, CnpjCpf, IE, Email, NomeContato, Endereco, Bairro, CEP, Cidade, Telefone, Celular, DataCadastro;
	private Button Atualizar;
	
	@Override
	protected void onCreate(Bundle icicle){ // Início do método onCreate
		super.onCreate(icicle);
		setContentView(R.layout.editar_clientes);
		
		Intent it = getIntent();
		ID = it.getIntExtra("codigo", 1);
		
		// Botão Salvar do xml editar_clientes
		Atualizar = (Button) findViewById(R.id.btnAtualizar);
		
		final ClienteDAO dao = new ClienteDAO(getBaseContext());
		final ClienteVO vo = dao.getById(ID);
		
		Id              = (EditText) findViewById(R.id.edtId);
		RazaoSocialNome = (EditText) findViewById(R.id.edtRazao_Nome);
		NomeFantasia    = (EditText) findViewById(R.id.edtNomeFantasia);
		CnpjCpf         = (EditText) findViewById(R.id.edtCNPJ_CPF);
		IE              = (EditText) findViewById(R.id.edtIE);
		Email           = (EditText) findViewById(R.id.edtEmail);
		NomeContato     = (EditText) findViewById(R.id.edtNomeContato);
		Endereco        = (EditText) findViewById(R.id.edtEndereco);
		Bairro          = (EditText) findViewById(R.id.edtBairro);
		CEP             = (EditText) findViewById(R.id.edtCEP);
		Cidade          = (EditText) findViewById(R.id.edtCidade);
		Telefone        = (EditText) findViewById(R.id.edtTelefone);
		Celular         = (EditText) findViewById(R.id.edtCelular);
		DataCadastro    = (EditText) findViewById(R.id.edtData);
		
		Id.setText(vo.getId().toString());
		RazaoSocialNome.setText(vo.getRazaosocial_nome());
		NomeFantasia.setText(vo.getNome_fantasia());
		CnpjCpf.setText(vo.getCnpj_cpf());
		IE.setText(vo.getIe());
		Email.setText(vo.getEmail());
		NomeContato.setText(vo.getContato());
		Endereco.setText(vo.getEndereco());
		Bairro.setText(vo.getBairro());
		CEP.setText(vo.getCep());
		Cidade.setText(vo.getCidade());
		Telefone.setText(vo.getTelefone());
		Celular.setText(vo.getCelular());
		DataCadastro.setText(vo.getData_cadastro());
		

		Atualizar.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				
				ClienteVO vo = new ClienteVO();
				vo.setId(ID);
				vo.setRazaosocial_nome(RazaoSocialNome.getText().toString());
				vo.setNome_fantasia(NomeFantasia.getText().toString());
				vo.setCnpj_cpf(CnpjCpf.getText().toString());
				vo.setIe(IE.getText().toString());
				vo.setEmail(Email.getText().toString());
				vo.setContato(NomeContato.getText().toString());
				vo.setEndereco(Endereco.getText().toString());
				vo.setBairro(Bairro.getText().toString());
				vo.setCep(CEP.getText().toString());
				vo.setCidade(Cidade.getText().toString());
				vo.setTelefone(Telefone.getText().toString());
				vo.setCelular(Celular.getText().toString());
				vo.setData_cadastro(DataCadastro.getText().toString());
				
				ClienteDAO dao = new ClienteDAO(getBaseContext());
				if(dao.update(vo)){
					Toast.makeText(getBaseContext(), "Sucesso na atualização!", Toast.LENGTH_LONG).show();
					dao.fecha_banco();
					finish();
				}
			}
		});
		
	} // Fim do método onCreate
	
	 public void mensagemExibir(String titulo, String texto){
	    	AlertDialog.Builder mensagem = new AlertDialog.Builder(EditarClientes.this);
	    	mensagem.setTitle(titulo);
	    	mensagem.setMessage(texto);
	    	mensagem.setNeutralButton("Ok", null);
	    	mensagem.show();
	 }
	
} // Fim da Classe EditarClientes

E deu novamente:

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

Cara, já não sei, pesquisei esse erro e achei isso

F

E o que seria isso? Esse site eu acho meio complicado. O engraçado é que ta funcionando perfeitamente.

F

A resposta seria essa:

@Override
protected void onDestroy() {
    super.onDestroy();
    if (openHelper != null) {
        openHelper.close();
    }
    if (cdh != null) {
        cdh.close();
    }
}

Onde colocaria isso? Teria que adaptar para o meu, certo?

F

kmunga, encontrei isso:

"Bom… passei por esse erro e pelejei também…

Observem alguns pontos:

1 - caso sua aplicação de algum outro erro qualquer e feche inesperadamente antes do close de seu cursor, apenas algum tempo depois ela vai avisar que teve que fechar o cursor;

2 - após retornar o cursor feche ele e feche também se der algum erro, implementando as exceções do erro;

3 - sempre que fechar o logcat vai indicar onde estava o cursor, daí vocês vão la e implementem seu fechamento, exception, etc

tentei relembrar o que usei para resolver esses problemas e acho que descrevi tudo… espero que seguindo esses conselhos consigam resolver tbm…"

http://www.portalandroid.org/comunidade/viewtopic.php?f=5&t=11105

http://www.guj.com.br/java/273309-duvida-android-sqlite

Mas não estou conseguindo arrumar isso.

Será que pode ser na Listar.java?

Listar.java

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()));
						dao.fecha_banco();
					}
				}
			});
			
			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	
}
K

O que o site tá flanado é fechar o banco no metodo onDestroy().

pode ser nesta parte

@Override public void onResume(){ super.onResume(); ClienteDAO dao = new ClienteDAO(getBaseContext()); lista = dao.getAll(); ltw.setAdapter(new ClienteAdapter(getBaseContext(), lista)); }

tu não fechou o banco, tenta um dao.fecha_banco();

F

No DAO, CadastrarClientes, EditarClientes, qual classe faria isso?

Adaptar esse para o meu, certo? Como seria?

@Override
protected void onDestroy() {
    super.onDestroy();
    if (openHelper != null) {
        openHelper.close();
    }
    if (cdh != null) {
        cdh.close();
    }
}
F

Fiz assim, na Listar.java

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.database.sqlite.SQLiteDatabase;
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 SQLiteDatabase db;
	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));
		dao.fecha_banco();
	}
	
	@Override  
	protected void onDestroy() {  
	    super.onDestroy();  
	    if (db != null) {  
	        db.close();  
	    }  
	}  
	
	
	
	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()));
						dao.fecha_banco();
					}
				}
			});
			
			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	
}
F

EditarClientes.java

package com.br.aquavendas;

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

import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class EditarClientes extends Activity { // Início da Classe EditarClientes
	private int ID = 0; 
	
	private SQLiteDatabase db;
	
	private EditText Id, RazaoSocialNome, NomeFantasia, CnpjCpf, IE, Email, NomeContato, Endereco, Bairro, CEP, Cidade, Telefone, Celular, DataCadastro;
	private Button Atualizar;
	
	@Override
	protected void onCreate(Bundle icicle){ // Início do método onCreate
		super.onCreate(icicle);
		setContentView(R.layout.editar_clientes);
		
		Intent it = getIntent();
		ID = it.getIntExtra("codigo", 1);
		
		// Botão Salvar do xml editar_clientes
		Atualizar = (Button) findViewById(R.id.btnAtualizar);
		
		final ClienteDAO dao = new ClienteDAO(getBaseContext());
		final ClienteVO vo = dao.getById(ID);
		
		Id              = (EditText) findViewById(R.id.edtId);
		RazaoSocialNome = (EditText) findViewById(R.id.edtRazao_Nome);
		NomeFantasia    = (EditText) findViewById(R.id.edtNomeFantasia);
		CnpjCpf         = (EditText) findViewById(R.id.edtCNPJ_CPF);
		IE              = (EditText) findViewById(R.id.edtIE);
		Email           = (EditText) findViewById(R.id.edtEmail);
		NomeContato     = (EditText) findViewById(R.id.edtNomeContato);
		Endereco        = (EditText) findViewById(R.id.edtEndereco);
		Bairro          = (EditText) findViewById(R.id.edtBairro);
		CEP             = (EditText) findViewById(R.id.edtCEP);
		Cidade          = (EditText) findViewById(R.id.edtCidade);
		Telefone        = (EditText) findViewById(R.id.edtTelefone);
		Celular         = (EditText) findViewById(R.id.edtCelular);
		DataCadastro    = (EditText) findViewById(R.id.edtData);
		
		Id.setText(vo.getId().toString());
		RazaoSocialNome.setText(vo.getRazaosocial_nome());
		NomeFantasia.setText(vo.getNome_fantasia());
		CnpjCpf.setText(vo.getCnpj_cpf());
		IE.setText(vo.getIe());
		Email.setText(vo.getEmail());
		NomeContato.setText(vo.getContato());
		Endereco.setText(vo.getEndereco());
		Bairro.setText(vo.getBairro());
		CEP.setText(vo.getCep());
		Cidade.setText(vo.getCidade());
		Telefone.setText(vo.getTelefone());
		Celular.setText(vo.getCelular());
		DataCadastro.setText(vo.getData_cadastro());
		

		Atualizar.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				
				ClienteVO vo = new ClienteVO();
				vo.setId(ID);
				vo.setRazaosocial_nome(RazaoSocialNome.getText().toString());
				vo.setNome_fantasia(NomeFantasia.getText().toString());
				vo.setCnpj_cpf(CnpjCpf.getText().toString());
				vo.setIe(IE.getText().toString());
				vo.setEmail(Email.getText().toString());
				vo.setContato(NomeContato.getText().toString());
				vo.setEndereco(Endereco.getText().toString());
				vo.setBairro(Bairro.getText().toString());
				vo.setCep(CEP.getText().toString());
				vo.setCidade(Cidade.getText().toString());
				vo.setTelefone(Telefone.getText().toString());
				vo.setCelular(Celular.getText().toString());
				vo.setData_cadastro(DataCadastro.getText().toString());
				
				ClienteDAO dao = new ClienteDAO(getBaseContext());
				if(dao.update(vo)){
					Toast.makeText(getBaseContext(), "Sucesso na atualização!", Toast.LENGTH_LONG).show();
					dao.fecha_banco();
					finish();
				}
			}
		});
		
	} // Fim do método onCreate
	
	@Override  
	protected void onDestroy() {  
	    super.onDestroy();  
	    if (db != null) {  
	        db.close();  
	    }  
	}  

	
	 public void mensagemExibir(String titulo, String texto){
	    	AlertDialog.Builder mensagem = new AlertDialog.Builder(EditarClientes.this);
	    	mensagem.setTitle(titulo);
	    	mensagem.setMessage(texto);
	    	mensagem.setNeutralButton("Ok", null);
	    	mensagem.show();
	 }
	
} // Fim da Classe EditarClientes

Não sei mais onde fazer. Continua dando a mensagem

10-11 18:24:00.556: E/Database(278): close() was never explicitly called on database '/data/data/com.br.aquavendas/databases/aqua.db' 
10-11 18:24:00.556: E/Database(278): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
10-11 18:24:00.556: E/Database(278): 	at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1810)
10-11 18:24:00.556: E/Database(278): 	at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:817)
10-11 18:24:00.556: E/Database(278): 	at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:851)
10-11 18:24:00.556: E/Database(278): 	at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:844)
10-11 18:24:00.556: E/Database(278): 	at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:540)
10-11 18:24:00.556: E/Database(278): 	at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)
10-11 18:24:00.556: E/Database(278): 	at com.br.aquavendas.banco.DB.getDatabase(DB.java:35)
10-11 18:24:00.556: E/Database(278): 	at com.br.aquavendas.dao.ClienteDAO.<init>(ClienteDAO.java:25)
10-11 18:24:00.556: E/Database(278): 	at com.br.aquavendas.EditarClientes.onCreate(EditarClientes.java:39)
10-11 18:24:00.556: E/Database(278): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
10-11 18:24:00.556: E/Database(278): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
10-11 18:24:00.556: E/Database(278): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
10-11 18:24:00.556: E/Database(278): 	at android.app.ActivityThread.access$2300(ActivityThread.java:125)
10-11 18:24:00.556: E/Database(278): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
10-11 18:24:00.556: E/Database(278): 	at android.os.Handler.dispatchMessage(Handler.java:99)
10-11 18:24:00.556: E/Database(278): 	at android.os.Looper.loop(Looper.java:123)
10-11 18:24:00.556: E/Database(278): 	at android.app.ActivityThread.main(ActivityThread.java:4627)
10-11 18:24:00.556: E/Database(278): 	at java.lang.reflect.Method.invokeNative(Native Method)
10-11 18:24:00.556: E/Database(278): 	at java.lang.reflect.Method.invoke(Method.java:521)
10-11 18:24:00.556: E/Database(278): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
10-11 18:24:00.556: E/Database(278): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
10-11 18:24:00.556: E/Database(278): 	at dalvik.system.NativeStart.main(Native Method)

http://maicon.strey.nom.br/blog/2012/07/20/como-interpretar-o-log-do-android/

F

Classe DB.java

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
		
	}
	
	public SQLiteDatabase getDatabase(){    
        return this.getWritableDatabase();    // pelo LogCat linha 35 é aqui.
    }   

}
K

Veio, já não sei mais o que fazer para te ajudar ai :confused: se eu descobrir algo volto a postar aqui.

F

Muito menos eu, não sei o que fazer.

A

Olá fbrigatt

Dei uma olhada rápida nos códigos que postou e notei que está com uma bela confusão!
Como você vem de uma ferramenta RAD, com Java e o Android você precisa retreinar o seu paradigma de programação.
Detalhes que antes a ferramenta cuidava agora é você quem deve se preocupar.
Não conheço o Delphi, então estou achando que seja isso. Se estiver errado, por favor, me corrija!

Veja a activity EditarClientes:

Você definiu essa variável “private SQLiteDatabase db;” e no onCreate você fez:

final ClienteDAO dao = new ClienteDAO(getBaseContext()); final ClienteVO vo = dao.getById(ID);
E no onClick do botão atualizar:

ClienteDAO dao = new ClienteDAO(getBaseContext()); if(dao.update(vo)){ Toast.makeText(getBaseContext(), "Sucesso na atualização!", Toast.LENGTH_LONG).show(); dao.fecha_banco(); finish(); }

E no onDestroy

if (db != null) { db.close(); }

Note que você criou duas instâncias do seu ClienteDAO e só fecha no "if(dao.update(vo)){ " ficando aberto se não entrar no if ( e se não entrar no onClick…).
Outra coisa é que no onDestroy está checando a variável db, mas não vi nenhuma referência a ela no código postado. Fica uma sensação de que está misturando conceitos: não deveria estar usando o DAO?

A minha sensação é de que não esteja usando um material adequado para estudar/aprender o Android, se for isso recomendo esse livro da Casa do Código, é bem sintético mas para você vai ser muito produtivo, acredite.
Google Android: crie aplicações para celulares e tablets do João Bosco Monteiro.
E tem outra vantagem: é bem acessível R$29,90. (Estou fazendo propaganda de graça!).
Em poucas horas dá para ler e você vai ter um bom exemplo de como programar o Android.

Outra sensação que fica é que está copiando/colando código sem saber/entender para que serve/como funciona. Assim não dá. Programar desse jeito é uma temeridade.

Desculpe-me e corrija-me se estiver errado, mas é o que sinto.
Abraços

F

A H Gusukuma, obrigado pelas dicas. Ok, vou ver esse livro. Mas no momento, preciso arrumar essa bagunça, como que faria? Qual seria o caminho pra começar a arrumar isso? To tentando terminar, mas esse erro ta me deixando loko. Me ajuda, prometo não incomodar mais. Por onde e como como começar a arrumar? Qual seria a maneira correta pra arrumar?

Obrigado, e você está certíssimo no que disse, valeu.

F

Aqui deveria ter mais coisa? Tirar o if como postei aqui? Teria que dar um dao.fecha_banco() também? Se colocar o dao.fecha_banco(), vai dar erro.

@Override  
	protected void onDestroy() {  
	    super.onDestroy();  
	        db.close();
	}

No onClick do botão atualizar: Aqui está certo?

no onClick do botão atualizar: 
ClienteDAO dao = new ClienteDAO(getBaseContext());    
  if(dao.update(vo)){    
      Toast.makeText(getBaseContext(), "Sucesso na atualização!", Toast.LENGTH_LONG).show();    
      dao.fecha_banco();    
      finish();    
  }
A

Acho que você deveria começar pelo livro. É ebook.
Esquece o projeto por algumas horas, leia o livro, vai ganhar dias com isso.
Não adianta ficar focado todo o tempo em corrigir sem um norte!

PS: Eu teria que gastar um tempo enorme para te ajudar, um tempo que infelizmente não tenho.
Acredite, vai sair muito mais barato para nós dois se você dar uma estudada no livro.

F

Me passa o link do livro, vc tem ai?

A

Em baixo da página tem: Alura, Caellum e Casa do Código

F

Parece que consegui arrumar, estou testando.

A

Resolveu?

F

Parece que sim. Agora estou com outro problema, poderia me ajudar?

http://www.guj.com.br/java/304344-menus-e-sub-menus-actionbar

A

fbrigatt:
Parece que sim. Agora estou com outro problema, poderia me ajudar?

http://www.guj.com.br/java/304344-menus-e-sub-menus-actionbar

Seria interessante postar como resolveu o problema, ajudará outros com o mesmo problema.
Grato

F

Ok, Resolvido.

F

A H Gusukuma

Tem como ver esse link aqui:

http://www.guj.com.br/java/304344-menus-e-sub-menus-actionbar

A

Não entendeu, explica como resolveu o problema.

F

Fiz o que vc tinha dito. Tinha duas instâncias do DAO aberta e somente uma fechada. Removi a que estava sobrando porque não precisava dela e resolveu o problema.

A

fbrigatt:
A H Gusukuma

Tem como ver esse link aqui:

http://www.guj.com.br/java/304344-menus-e-sub-menus-actionbar

Não sei, não tenho conhecimento do assunto.

F

Ok, minha solução foi clara? As vezes alguém está tendo o mesmo problema, ta aí a solução

Criado 20 de setembro de 2013
Ultima resposta 15 de out. de 2013
Respostas 79
Participantes 4