Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Erro ao inserir e listar alunos

Boa noite,

Ao tentar inserir um aluno, o erro abaixo é exibido.

Segue o meu código no GitHub

https://github.com/CaPitondo/Agenda.git

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: br.com.camilabalat.agenda, PID: 32589
    java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
        at br.com.camilabalat.agenda.FormularioHelper.pegaAluno(FormularioHelper.java:29)
        at br.com.camilabalat.agenda.FormularioActivity.onOptionsItemSelected(FormularioActivity.java:54)
        at android.app.Activity.onMenuItemSelected(Activity.java:3543)
        at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:436)
        at android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:196)
        at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:109)
        at android.support.v7.app.AppCompatDelegateImpl.onMenuItemSelected(AppCompatDelegateImpl.java:888)
        at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:840)
        at android.support
3 respostas
solução!

Ola Camila

No construtor da classe FormularioHelper, você esta pegando a referência dos campos da tela e atribuindo a algumas variáveis.

public class FormularioHelper {
    private EditText campoNome;
    private EditText campoEndereco;
    private EditText campoTelefone;
    private EditText campoSite;
    private RatingBar campoNota;

    public FormularioHelper(FormularioActivity activity){
        EditText campoNome = (EditText) activity.findViewById(R.id.formulario_nome);
        EditText campoEndereco = (EditText) activity.findViewById(R.id.formulario_endereco);
        EditText campoTelefone = (EditText) activity.findViewById(R.id.formulario_telefone);
        EditText campoSite = (EditText) activity.findViewById(R.id.formulario_site);
        RatingBar campoNota = (RatingBar) activity.findViewById(R.id.formulario_nota);
    }

    public Aluno pegaAluno(){
        Aluno aluno = new Aluno();
        aluno.setNome(campoNome.getText().toString());
        aluno.setEndereco(campoEndereco.getText().toString());
        aluno.setTelefone(campoTelefone.getText().toString());
        aluno.setSite(campoSite.getText().toString());
        aluno.setNota(Double.valueOf(campoNota.getProgress()));
        return aluno;
    }
}

Mas note que, você esta atribuindo essas referências, as variáveis que só existem dentro do construtor. Então quando você vai chamar por exemplo

aluno.setNome(campoNome.getText().toString());

recebe um NullPointerException, pois campoNome, neste momento é o atributo da classe, e não a variável do construtor.

Para resolver seu problema, você precisa atribuir essas referências, aos atributos da classe, dessa maneira

public FormularioHelper(FormularioActivity activity){
        campoNome = (EditText) activity.findViewById(R.id.formulario_nome);
        campoEndereco = (EditText) activity.findViewById(R.id.formulario_endereco);
        campoTelefone = (EditText) activity.findViewById(R.id.formulario_telefone);
        campoSite = (EditText) activity.findViewById(R.id.formulario_site);
        campoNota = (RatingBar) activity.findViewById(R.id.formulario_nota);
    }

Também percebi que na classe AlunoDAO, na String com o script para criar o bando de dados, você escreveu endereço com a ç

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "CREATE TABLE Alunos (" +
                "id INTEGER PRIMARY KEY, " +
                "nome TEXT NOT NULL, " +
                "endereço TEXT, " +
                "telefone TEXT, " +
                "site TEXT, " +
                "nota REAL);";
        db.execSQL(sql);
    }

Mas no método insere, você escreveu sem a ç

 dados.put("endereco", aluno.getEndereco());

Solução 1

Você pode, alterar o método insere, escrevendo endereço

dados.put("endereço", aluno.getEndereco());

Solução 2

Ou pode alterar o método onCreate e escrever endereco na String do script.

"endereco TEXT, " +

Mas lembre de desinstalar manualmente o aplicativo do dispositivo (emulador ou celular) antes de reinstalar o aplicativo. Assim garante que não terá erros relacionado a versão do banco de dados.

Boa tarde Alessandro,

Muito obrigada pelo retorno. Hoje, pela manhã, refiz todos o passo a passo do curso novamente e encontrei exatamente os erros que você apontou. Foi distração minha mesmo.

Muito obrigada =)