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

Minha agenda Alunos não faz atualizações

Prezados,

Ao implementar meu código, após assistir o último vídeo (Editando Alunos|04 - Editando Alunos), o meu código ainda assim não consegue atualizar os dados, ele criar um novo com uma chave nova (igual ao vídeo anterior 03-Passando dados entre Activities).

Para esclarecer ainda mais o ocorrido, o meu botão salvar que fica na parte inferior ainda existe e é por meio dele que salvo aluno novo.

Abaixo, segue o código da minha classe FormularioActivity para análise e ajuda. Acredito que devo estar pecando na lógica.

6 respostas
package br.com.fabianoneves.agenda;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Switch;
import android.widget.Toast;

import br.com.fabianoneves.agenda.DAO.AlunoDAO;
import br.com.fabianoneves.agenda.modelo.Aluno;

import static br.com.fabianoneves.agenda.R.id.*;

public class FormularioActivity extends AppCompatActivity {

    private FormularioHelper helper;

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

        helper = new FormularioHelper(this);

        //Esse método faz que quando clicamos no aluno Salvo, ele abraça o Formulário preenchido
        Intent intent = getIntent();
        Aluno aluno = (Aluno)intent.getSerializableExtra("aluno");
        if (aluno != null){
            helper.preencheFormulario(aluno);
        }

       /*Inicio do tratamento do botão salvar*/
        Button botaoSalvar = (Button) findViewById(formulario_salvar);
        botaoSalvar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                        /*aqui é onde criamos o evento do botão*/
                        //Depois de clicar no botão o código abaixo vai recuperar as informações na active lista de alunos
                        Aluno aluno = helper.pegaAluno();
                        AlunoDAO dao = new AlunoDAO(FormularioActivity.this);
                        //If para verificar se estamos preenchendo aluno novo pela ausência de ID ou alteração de um aluno pela existência de ID
                        if (aluno.getId() != null) {
                            dao.altera(aluno);
                        } else {
                            dao.insere(aluno);
                        }
                        dao.close();

                        Toast.makeText(FormularioActivity.this, "Aluno " + aluno.getNome() + " Salvo", Toast.LENGTH_SHORT).show();
                        finish(); //ao invés de criar um novo tratamento indo pra outra tela, coloca-se apenas o "finish()" para não duplicar a tela
                }
        });
    }
// Aqui estamos criando uma instância que faz o botão salver ir para barra de título
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_formulario, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        /*aqui é onde criamos o evento do botão*/
        switch (item.getItemId()){
            case R.id.menu_formulario_ok:

                //Depois de clicar no botão o código abaixo vai recuperar as informações na active lista de alunos
                Aluno aluno = helper.pegaAluno();
                Toast.makeText(FormularioActivity.this, "Aluno " + aluno.getNome() + " Salvo", Toast.LENGTH_SHORT).show();
            finish(); //ao invés de criar um novo tratamento indo pra outra tela, coloca-se apenas o "finish()" para não duplicar a tela
            break;
        }

        return super.onOptionsItemSelected(item);
    }
}





É possível que o erro esteja na classe FormularioHelper, tem como você mandar o código dela? Pode ser que no método pegaAluno() você ainda esteja usando a implementação antiga, que é a de instanciar um novo Aluno, ao invés de devolver o que já foi instanciado no construtor e/ou atualizado no método preencheFormulario().

Boa Noite Paulo,

Segue o código da classe FormularioHelper:

package br.com.fabianoneves.agenda;
//Essa classe serve para pegar os dados quando digitado na FormularioActivity
import android.widget.EditText;
import android.widget.RatingBar;

import br.com.fabianoneves.agenda.modelo.Aluno;

public class FormularioHelper {
    private final EditText campoNome;
    private final EditText campoEndereco;
    private final EditText campoCidade;
    private final EditText campoUf;
    private final EditText campoTelefone;
    private final EditText campoCelular;
    private final EditText campoEmail;
    private final EditText campoSite;
    private final RatingBar campoNota;

    private Aluno aluno;

    public FormularioHelper(FormularioActivity activity){
        campoNome = (EditText) activity.findViewById(R.id.formulario_nome);
        campoEndereco = (EditText) activity.findViewById(R.id.formulario_endereco);
        campoCidade = (EditText) activity.findViewById(R.id.formulario_cidade);
        campoUf = (EditText) activity.findViewById(R.id.formulario_uf);
        campoTelefone = (EditText) activity.findViewById(R.id.formulario_telefone);
        campoCelular = (EditText) activity.findViewById(R.id.formulario_celular);
        campoEmail = (EditText) activity.findViewById(R.id.formulario_email);
        campoSite = (EditText) activity.findViewById(R.id.formulario_site);
        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.setCidade(campoCidade.getText().toString());
        aluno.setUf(campoUf.getText().toString());
        aluno.setTelefone(campoTelefone.getText().toString());
        aluno.setCelular(campoCelular.getText().toString());
        aluno.setEmail(campoEmail.getText().toString());
        aluno.setSite(campoSite.getText().toString());
        aluno.setNota(Double.valueOf(campoNota.getProgress()));
        return aluno;

    }

    public void preencheFormulario(Aluno aluno) {
        campoNome.setText(aluno.getNome());
        campoEndereco.setText(aluno.getEndereco());
        campoCidade.setText(aluno.getCidade());
        campoUf.setText(aluno.getUf());
        campoTelefone.setText(aluno.getTelefone());
        campoCelular.setText(aluno.getCelular());
        campoEmail.setText(aluno.getEmail());
        campoSite.setText(aluno.getSite());
        campoNota.setProgress(aluno.getNota().intValue());
        this.aluno = aluno;
    }
}

Então é isso mesmo mano, no método pegaAluno() você está sempre criando um aluno novo e mandando ele ao invés de mandar de volta o aluno que veio pra ser editado. Como esse aluno novo não tem um ID, o seu programa sempre vai achar que é pra fazer uma nova inserção no banco, ao invés de uma alteração.

Pro código funcionar direito você precisa tirar o Aluno aluno = new Aluno(); do método pegaAluno(), e colocar this.aluno = new Aluno(); no construtor da classe.

solução!

O código vai ficar assim:

package br.com.fabianoneves.agenda;
//Essa classe serve para pegar os dados quando digitado na FormularioActivity
import android.widget.EditText;
import android.widget.RatingBar;

import br.com.fabianoneves.agenda.modelo.Aluno;

public class FormularioHelper {
    private final EditText campoNome;
    private final EditText campoEndereco;
    private final EditText campoCidade;
    private final EditText campoUf;
    private final EditText campoTelefone;
    private final EditText campoCelular;
    private final EditText campoEmail;
    private final EditText campoSite;
    private final RatingBar campoNota;

    private Aluno aluno;

    public FormularioHelper(FormularioActivity activity){
        campoNome = (EditText) activity.findViewById(R.id.formulario_nome);
        campoEndereco = (EditText) activity.findViewById(R.id.formulario_endereco);
        campoCidade = (EditText) activity.findViewById(R.id.formulario_cidade);
        campoUf = (EditText) activity.findViewById(R.id.formulario_uf);
        campoTelefone = (EditText) activity.findViewById(R.id.formulario_telefone);
        campoCelular = (EditText) activity.findViewById(R.id.formulario_celular);
        campoEmail = (EditText) activity.findViewById(R.id.formulario_email);
        campoSite = (EditText) activity.findViewById(R.id.formulario_site);
        campoNota = (RatingBar) activity.findViewById(R.id.formulario_nota);
    this.aluno = new Aluno(); // criar o aluno no construtor
    }

    public Aluno pegaAluno() {
        aluno.setNome(campoNome.getText().toString());
        aluno.setEndereco(campoEndereco.getText().toString());
        aluno.setCidade(campoCidade.getText().toString());
        aluno.setUf(campoUf.getText().toString());
        aluno.setTelefone(campoTelefone.getText().toString());
        aluno.setCelular(campoCelular.getText().toString());
        aluno.setEmail(campoEmail.getText().toString());
        aluno.setSite(campoSite.getText().toString());
        aluno.setNota(Double.valueOf(campoNota.getProgress()));
        return aluno; // sempre vai retornar o aluno criado no construtor ou o atribuido no método preencheFormulario()

    }

    public void preencheFormulario(Aluno aluno) {
        campoNome.setText(aluno.getNome());
        campoEndereco.setText(aluno.getEndereco());
        campoCidade.setText(aluno.getCidade());
        campoUf.setText(aluno.getUf());
        campoTelefone.setText(aluno.getTelefone());
        campoCelular.setText(aluno.getCelular());
        campoEmail.setText(aluno.getEmail());
        campoSite.setText(aluno.getSite());
        campoNota.setProgress(aluno.getNota().intValue());
        this.aluno = aluno;
    }
}

Deu certo, obrigado era isso mesmo.