Error database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0

-2

The following error is occurring in my application and I can not resolve it. Can you help me ?

 E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.sala304b.padariacoimbra, PID: 15159
                  java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sala304b.padariacoimbra/com.example.sala304b.padariacoimbra.view.EditarActivity}: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2984)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3045)
                      at android.app.ActivityThread.-wrap14(ActivityThread.java)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1642)
                      at android.os.Handler.dispatchMessage(Handler.java:102)
                      at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6776)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1518)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)
                   Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
                      at android.database.AbstractCursor.checkPosition(AbstractCursor.java:460)
                      at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
                      at android.database.AbstractWindowedCursor.getInt(AbstractWindowedCursor.java:68)
                      at com.example.sala304b.padariacoimbra.repository.UsuarioRepository.GetUsuario(UsuarioRepository.java:87)
                      at com.example.sala304b.padariacoimbra.view.EditarActivity.CarregaValoresCampos(EditarActivity.java:197)
at com.example.sala304b.padariacoimbra.view.EditarActivity.onCreate(EditarActivity.java:40)
                      at android.app.Activity.performCreate(Activity.java:6956)
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1126)
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2927)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3045) 
                      at android.app.ActivityThread.-wrap14(ActivityThread.java) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1642) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:154) 
                      at android.app.ActivityThread.main(ActivityThread.java:6776) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1518) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408) 

Here are the codes that I believe contain the error.

UserRepository class:

package com.example.sala304b.padariacoimbra.repository;

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

import com.example.sala304b.padariacoimbra.dao.UsuarioDao;
import com.example.sala304b.padariacoimbra.model.Usuario;

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

public class UsuarioRepository {
    UsuarioDao usuarioDao;

    public UsuarioRepository(Context context){

        usuarioDao =  new UsuarioDao(context);

    }

    /***
     * SALVA UM NOVO REGISTRO NA BASE DE DADOS
     */
    public void Salvar(Usuario pessoaModel){

        ContentValues contentValues =  new ContentValues();
        /*MONTANDO OS PARAMETROS PARA SEREM SALVOS*/
        contentValues.put("usuario_usuario",       pessoaModel.getUsuario());
        contentValues.put("senha_usuario",   pessoaModel.getSenha());
        contentValues.put("nome_usuario",       pessoaModel.getNome());
        contentValues.put("telefone_usuario", pessoaModel.getTelefone());
        contentValues.put("cidade_usuario",pessoaModel.getCidade());
        contentValues.put("bairro_usuario",      pessoaModel.getBairro());
        contentValues.put("rua_usuario",      pessoaModel.getRua());
        contentValues.put("numero_usuario",      pessoaModel.getNumero());

        /*EXECUTANDO INSERT DE UM NOVO REGISTRO*/
        usuarioDao.GetConexaoDataBase().insert("table_usuario",null,contentValues);

    }

    /***
     * ATUALIZA UM REGISTRO JÁ EXISTENTE NA BASE
     */
    public void Atualizar(Usuario pessoaModel){

        ContentValues contentValues =  new ContentValues();

        /*MONTA OS PARAMENTROS PARA REALIZAR UPDATE NOS CAMPOS*/
        contentValues.put("usuario_usuario",       pessoaModel.getUsuario());
        contentValues.put("senha_usuario",   pessoaModel.getSenha());
        contentValues.put("nome_usuario",       pessoaModel.getNome());
        contentValues.put("telefone_usuario", pessoaModel.getTelefone());
        contentValues.put("cidade_usuario",pessoaModel.getCidade());
        contentValues.put("bairro_usuario",      pessoaModel.getBairro());
        contentValues.put("rua_usuario",      pessoaModel.getRua());
        contentValues.put("numero_usuario",      pessoaModel.getNumero());

        /*REALIZANDO UPDATE PELA CHAVE DA TABELA*/
        usuarioDao.GetConexaoDataBase().update("table_usuario", contentValues, "id_usuario = ?", new String[]{Integer.toString(pessoaModel.getId())});
    }

    /***
     * EXCLUI UM REGISTRO PELO CÓDIGO
     */
    public Integer Excluir(int id){

        //EXCLUINDO  REGISTRO E RETORNANDO O NÚMERO DE LINHAS AFETADAS
        return usuarioDao.GetConexaoDataBase().delete("table_usuario","id_usuario = ?", new String[]{Integer.toString(id)});
    }

    /***
     * CONSULTA UMA PESSOA CADASTRADA PELO CÓDIGO
     * @return
     */
    public Usuario GetUsuario(int id){

        Cursor cursor = usuarioDao.GetConexaoDataBase().rawQuery("SELECT * FROM table_usuario WHERE id_usuario= "+ id,null);

        cursor.moveToFirst();

        ///CRIANDO UMA NOVA PESSOA
        Usuario pessoaModel =  new Usuario();

        //ADICIONANDO OS DADOS DA PESSOA
        pessoaModel.setId(cursor.getInt(cursor.getColumnIndex("id_usuario")));
        pessoaModel.setUsuario(cursor.getString(cursor.getColumnIndex("usuario_usuario")));
        pessoaModel.setSenha(cursor.getString(cursor.getColumnIndex("senha_usuario")));
        pessoaModel.setNome(cursor.getString(cursor.getColumnIndex("nome_usuario")));
        pessoaModel.setTelefone(cursor.getString(cursor.getColumnIndex("telefone_usuario")));
        pessoaModel.setCidade(cursor.getString(cursor.getColumnIndex("cidade_usuario")));
        pessoaModel.setBairro(cursor.getString(cursor.getColumnIndex("bairro_usuario")));
        pessoaModel.setRua(cursor.getString(cursor.getColumnIndex("rua_usuario")));
        pessoaModel.setNumero(cursor.getString(cursor.getColumnIndex("numero_usuario")));

        //RETORNANDO A PESSOA
        return pessoaModel;

    }

    /***
     * CONSULTA TODAS AS PESSOAS CADASTRADAS NA BASE
     */
    public List<Usuario> SelecionarTodos(){

        List<Usuario> pessoas = new ArrayList<Usuario>();

        //MONTA A QUERY A SER EXECUTADA
        StringBuilder stringBuilderQuery = new StringBuilder();
        stringBuilderQuery.append(" SELECT id_usuario,      ");
        stringBuilderQuery.append("        usuario_usuario,        ");
        stringBuilderQuery.append("        senha_usuario,    ");
        stringBuilderQuery.append("        nome_usuario,        ");
        stringBuilderQuery.append("        telefone_usuario,  ");
        stringBuilderQuery.append("        cidade_usuario, ");
        stringBuilderQuery.append("        bairro_usuario,        ");
        stringBuilderQuery.append("        rua_usuario,        ");
        stringBuilderQuery.append("        numero_usuario        ");
        stringBuilderQuery.append("  FROM  table_usuario       ");
        stringBuilderQuery.append(" ORDER BY usuario_usuario       ");

        //CONSULTANDO OS REGISTROS CADASTRADOS
        Cursor cursor = usuarioDao.GetConexaoDataBase().rawQuery(stringBuilderQuery.toString(), null);

        /*POSICIONA O CURSOR NO PRIMEIRO REGISTRO*/
        cursor.moveToFirst();

        Usuario pessoaModel;

        //REALIZA A LEITURA DOS REGISTROS ENQUANTO NÃO FOR O FIM DO CURSOR
        while (!cursor.isAfterLast()){

            /* CRIANDO UMA NOVA PESSOAS */
            pessoaModel =  new Usuario();

            //ADICIONANDO OS DADOS DA PESSOA
            pessoaModel.setId(cursor.getInt(cursor.getColumnIndex("id_usuario")));
            pessoaModel.setUsuario(cursor.getString(cursor.getColumnIndex("usuario_usuario")));
            pessoaModel.setSenha(cursor.getString(cursor.getColumnIndex("senha_usuario")));
            pessoaModel.setNome(cursor.getString(cursor.getColumnIndex("nome_usuario")));
            pessoaModel.setTelefone(cursor.getString(cursor.getColumnIndex("telefone_usuario")));
            pessoaModel.setCidade(cursor.getString(cursor.getColumnIndex("cidade_usuario")));
            pessoaModel.setBairro(cursor.getString(cursor.getColumnIndex("bairro_usuario")));
            pessoaModel.setRua(cursor.getString(cursor.getColumnIndex("rua_usuario")));
            pessoaModel.setNumero(cursor.getString(cursor.getColumnIndex("numero_usuario")));

            //ADICIONANDO UMA PESSOA NA LISTA
            pessoas.add(pessoaModel);

            //VAI PARA O PRÓXIMO REGISTRO
            cursor.moveToNext();
        }

        //RETORNANDO A LISTA DE PESSOAS
        return pessoas;

    }

}

View class EditActivity:

package com.example.sala304b.padariacoimbra.view;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import com.example.sala304b.padariacoimbra.R;
import com.example.sala304b.padariacoimbra.model.Usuario;
import com.example.sala304b.padariacoimbra.repository.UsuarioRepository;
import com.example.sala304b.padariacoimbra.uteis.Uteis;

public class EditarActivity extends AppCompatActivity {
    EditText       editTextCodigo;
    EditText       editTextUsuario;
    EditText       editTextSenha;
    EditText       editTextNome;
    EditText       editTextTelefone;
    EditText       editTextCidade;
    EditText       editTextBairro;
    EditText       editTextRua;
    EditText       editTextNumero;
    Button         buttonAlterar;
    Button         buttonVoltar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_editar);

        this.CriarComponentes();

        this.CriarEventos();

        this.CarregaValoresCampos();
    }

    protected  void CriarComponentes(){

        editTextCodigo         = this.findViewById(R.id.editTextCodigo);

        editTextUsuario           = this.findViewById(R.id.edUsuario);

        editTextSenha           = this.findViewById(R.id.edSenha);

        editTextNome           = this.findViewById(R.id.edNome);

        editTextTelefone           = this.findViewById(R.id.edTelefone);

        editTextCidade           = this.findViewById(R.id.edCidade);

        editTextBairro           = this.findViewById(R.id.edBairro);

        editTextRua           = this.findViewById(R.id.edRua);

        editTextNumero           = this.findViewById(R.id.edNumero);

        buttonAlterar           = this.findViewById(R.id.buttonAlterar);

        buttonVoltar           = this.findViewById(R.id.buttonVoltar);

    }

    protected  void CriarEventos(){

        buttonAlterar.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {

                Alterar_onClick();
            }
        });

        buttonVoltar.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {

                Intent intentMainActivity = new Intent(getApplicationContext(), MainActivity.class);
                startActivity(intentMainActivity);
                finish();
            }
        });
    }

    protected  void Alterar_onClick(){

        if(editTextUsuario.getText().toString().trim().equals("")){

            Uteis.Alert(this, this.getString(R.string.usuario_obrigatorio));

            editTextUsuario.requestFocus();
        }

        else if(editTextSenha.getText().toString().trim().equals("")){

            Uteis.Alert(this, this.getString(R.string.senha_obrigatorio));

            editTextSenha.requestFocus();
        }

        else if(editTextNome.getText().toString().trim().equals("")){

            Uteis.Alert(this, this.getString(R.string.nome_obrigatorio));

            editTextNome.requestFocus();
        }

        else if(editTextTelefone.getText().toString().trim().equals("")){

            Uteis.Alert(this, this.getString(R.string.telefone_obrigatorio));

            editTextTelefone.requestFocus();
        }

        else if(editTextCidade.getText().toString().trim().equals("")){

            Uteis.Alert(this, this.getString(R.string.cidade_obrigatorio));

            editTextCidade.requestFocus();
        }

        else if(editTextBairro.getText().toString().trim().equals("")){

            Uteis.Alert(this, this.getString(R.string.bairro_obrigatorio));

            editTextBairro.requestFocus();
        }

        else if(editTextRua.getText().toString().trim().equals("")){

            Uteis.Alert(this, this.getString(R.string.rua_obrigatorio));

            editTextRua.requestFocus();
        }

        else if(editTextNumero.getText().toString().trim().equals("")){

            Uteis.Alert(this, this.getString(R.string.numero_obrigatorio));

            editTextNumero.requestFocus();
        }

        else{

            Usuario pessoaModel = new Usuario();

            pessoaModel.setUsuario(editTextUsuario.getText().toString().trim());
            pessoaModel.setSenha(editTextSenha.getText().toString().trim());
            pessoaModel.setNome(editTextNome.getText().toString().trim());
            pessoaModel.setTelefone(editTextTelefone.getText().toString().trim());
            pessoaModel.setCidade(editTextCidade.getText().toString().trim());
            pessoaModel.setBairro(editTextBairro.getText().toString().trim());
            pessoaModel.setRua(editTextRua.getText().toString().trim());
            pessoaModel.setNumero(editTextNumero.getText().toString().trim());

            new UsuarioRepository(this).Atualizar(pessoaModel);

            AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);

            alertDialog.setTitle(R.string.app_name);

            alertDialog.setMessage("Registro alterado com sucesso! ");

            alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int id) {

                    //RETORNA PARA A TELA DE CONSULTA
                    Intent intentRedirecionar = new Intent(getApplicationContext(), ConsultarActivity.class);

                    startActivity(intentRedirecionar);

                    finish();
                }
            });

            alertDialog.show();

        }

    }

    protected  void CarregaValoresCampos(){

        UsuarioRepository pessoaRepository = new UsuarioRepository(this);

        Bundle extra =  this.getIntent().getExtras();
        int id_pessoa = extra.getInt("id_usuario");

        Usuario pessoaModel = pessoaRepository.GetUsuario(id_pessoa);

        editTextCodigo.setText(String.valueOf(pessoaModel.getId()));

        editTextUsuario.setText(pessoaModel.getUsuario());

        editTextSenha.setText(pessoaModel.getSenha());

        editTextNome.setText(pessoaModel.getNome());

        editTextTelefone.setText(pessoaModel.getTelefone());

        editTextCidade.setText(pessoaModel.getCidade());

        editTextBairro.setText(pessoaModel.getBairro());

        editTextRua.setText(pessoaModel.getRua());

        editTextNumero.setText(pessoaModel.getNumero());

    }

}
    
asked by anonymous 17.06.2018 / 18:05

1 answer

1

What happens is that in the implementation of your GetUsuario method, you assume that there is always a user with the id informed, which is not true by the error.

First you should check whether the cursor actually has any result:

public Usuario GetUsuario(int id) {

  Cursor cursor = usuarioDao.GetConexaoDataBase()
      .rawQuery("SELECT * FROM table_usuario WHERE id_usuario= " + id, null);

  try {
    if (cursor == null || !cursor.moveToFirst()) {
      return null;
    }

    ///CRIANDO UMA NOVA PESSOA
    Usuario pessoaModel = new Usuario();

    //ADICIONANDO OS DADOS DA PESSOA
    pessoaModel.setId(cursor.getInt(cursor.getColumnIndex("id_usuario")));
    pessoaModel.setUsuario(cursor.getString(cursor.getColumnIndex("usuario_usuario")));
    pessoaModel.setSenha(cursor.getString(cursor.getColumnIndex("senha_usuario")));
    pessoaModel.setNome(cursor.getString(cursor.getColumnIndex("nome_usuario")));
    pessoaModel.setTelefone(cursor.getString(cursor.getColumnIndex("telefone_usuario")));
    pessoaModel.setCidade(cursor.getString(cursor.getColumnIndex("cidade_usuario")));
    pessoaModel.setBairro(cursor.getString(cursor.getColumnIndex("bairro_usuario")));
    pessoaModel.setRua(cursor.getString(cursor.getColumnIndex("rua_usuario")));
    pessoaModel.setNumero(cursor.getString(cursor.getColumnIndex("numero_usuario")));

    //RETORNANDO A PESSOA
    return pessoaModel;
  } finally {
    cursor.close();
  }
}

Now your CarregaValoresCampos method should check the result of the call:

Usuario pessoaModel = pessoaRepository.GetUsuario(id_pessoa);
if(pessoaModel == null) {
    // Usuario nao existe
}
    
19.06.2018 / 13:43