Pessoal, o que seria esse erro:
08-29 13:53:38.610: E/Cursor(343): Finalizing a Cursor that has not been deactivated or closed. database = /data/data/com.br.aquavendas/databases/aqua, table = clientes, query = SELECT * FROM clientes WHERE _id=1
08-29 13:53:38.610: E/Cursor(343): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
08-29 13:53:38.610: E/Cursor(343): at android.database.sqlite.SQLiteCursor.(SQLiteCursor.java:210)
O engraçado é que a aplicação funciona normalmente. Dá essa mensagem quando clico em um item da lista.
Então, o problema é em que parte do código que fecho. Pq tem duas formas de clicar na lista:
A primeira se clicar em um item abre a tela de Cadastro
A segunda é um long_click
cursor.close();
Não to sabendo onde fechar, alguém poderia me ajudar? Eu listo os clientes nesse trecho aqui:
// LISTAR TODOS OS CLIENTES
if(opcao.equals(Main.ItemMenu_2)){
carregaListaCliente();
}
Seria isso:
Cursor cliente = mDb.getCliente(mId);
cliente.close();
Cursor produto = mDb.getProduto(mId);
produto.close();
O ideal é fechar o Cursor logo após você deixar de usá-lo, depois que você preencher o seu objeto com os dados do cursor, fechá-lo.
Carrego aqui
// Lista todos os clientes
private void carregaListaCliente(){
Cursor cursor;
db.open();
cursor = db.getTodosClientes();
cursor.moveToFirst();
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.mostrabanco, cursor, new String[] {DbAdapter.KEY_RAZAOSOCIALNOME, DbAdapter.KEY_CELULAR, DbAdapter.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[] {DbAdapter.KEY_NOME, DbAdapter.KEY_CELULAR}, new int[] {android.R.id.text1, android.R.id.text2});
setListAdapter(adapter);
db.close();
//cursor.close();
}
Se habilitar a linha comentada cursor.close(), na hora de mostrar a lista não tem nada.
Seria nesse trecho aqui:
if(mId > 0 && cliente.moveToFirst()){
IdCodigoCliente.setText(cliente.getString(cliente.getColumnIndex(DbAdapter.KEY_IDCLI)));
// colocaria aqui o cliente.close(); ?????
Log.d("CarrosCliente", "mId: " + mId); // e aqui
NomeCliente.setText(cliente.getString(cliente.getColumnIndex(DbAdapter.KEY_RAZAOSOCIALNOME)));
}
Faça o seguinte: monte uma lista a partir do seu curso e passe essa lista para o seu Adapter, a lista com os objetos que deseja exibir.
Após preencher a lista com os dados do Cursor, feche-o.
Ataxexe
Agosto 30, 2013, 8:04am
#10
Não fique postando mensagens do tipo “Alguém?”. Não temos SLA no GUJ.
Na verdade, eu utilizo o que vem do cursor aqui. Então, acho que deveria fechá-lo onde está comentado, correto?
if(mId > 0 && cliente.moveToFirst()){
IdCodigoCliente.setText(cliente.getString(cliente.getColumnIndex(DbAdapter.KEY_IDCLI)));
// colocaria aqui o cliente.close(); ?????
Log.d("CarrosCliente", "mId: " + mId); // e aqui
NomeCliente.setText(cliente.getString(cliente.getColumnIndex(DbAdapter.KEY_RAZAOSOCIALNOME)));
}
Não, se você fechar onde está comentado, na hora de setar o Nome você não terá mais o Cursor.
Então seria no final:
NomeCliente.setText(cliente.getString(cliente.getColumnIndex(DbAdapter.KEY_RAZAOSOCIALNOME)));
cliente.close();
Obs.: Postei o onCreate no post do Spinner.
Está dando esse erro:
08-30 22:37:32.683: E/Cursor(278): Finalizing a Cursor that has not been deactivated or closed. database = /data/data/com.br.aquavendas/databases/aqua, table = clientes, query = SELECT * FROM clientes WHERE _id=6
Não estou identificando onde tenho que fechar esse Cursor.
Chamo a Lista da classe Vendas
Clientes = (Button) findViewById(R.id.btnClientes);
Clientes.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Vendas.this, Lista.class);
intent.putExtra("itemMenu", "2 - Listar Clientes");
startActivity(intent);
}
});
Esse trecho é o que carrega o listview com clientes, está na classe Lista.
// Lista todos os clientes
private void carregaListaCliente(){
Cursor cursor;
db.open();
cursor = db.getTodosClientes();
cursor.moveToFirst();
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.mostrabanco, cursor, new String[] {DbAdapter.KEY_RAZAOSOCIALNOME, DbAdapter.KEY_CELULAR, DbAdapter.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[] {DbAdapter.KEY_NOME, DbAdapter.KEY_CELULAR}, new int[] {android.R.id.text1, android.R.id.text2});
setListAdapter(adapter);
db.close();
}