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

Erro no projeto com RoomDatabase.

Bom dia.

Estou com um erro no projeto, quando eu vou criar aluno da um erro no app.

Aqui mensagem no console do android-studio:

Cannot access database on the main thread since it may potentially lock the UI for a long period of time.
4 respostas

Aqui a class:

public class FormularioAlunoActivity extends AppCompatActivity {

    private static final String TITULO_APPBAR_NOVO_ALUNO = "Novo aluno";
    private static final String TITULO_APPBAR_EDITA_ALUNO = "Edita aluno";
    private EditText campoNome;
    private EditText campoTelefone_Fixo;
    private EditText campoTelefone_Celular;
    private EditText campoEmail;
    private RoomAlunoDAO alunoDAO;
    private Aluno aluno;
    private TelefoneDAO telefoneDAO;
    private List<Telefone> telefoneList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_formulario_aluno);
        Agentadatabase database = Agentadatabase.getInstance(this);
        alunoDAO = database.getRoomAlunoDAO();
        telefoneDAO = database.getTelefoneDAO();
        inicializacaoDosCampos();
        carregaAluno();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu){
        getMenuInflater().inflate(R.menu.activity_formulario_aluno_menu, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int itemId = item.getItemId();
        if(itemId == R.id.activity_formulario_aluno_menu_salvar){
            finalizaFormulario();
        }
        return super.onOptionsItemSelected(item);
    }

    private void carregaAluno(){
        Intent dados = getIntent();
        if (dados.hasExtra(CHAVE_ALUNO)) {
            setTitle(TITULO_APPBAR_EDITA_ALUNO);
            aluno = (Aluno) dados.getSerializableExtra(CHAVE_ALUNO);
            preencheCampos();
        } else {
            setTitle(TITULO_APPBAR_NOVO_ALUNO);
            aluno = new Aluno();
        }
    }

    private void preencheCampos(){
        campoNome.setText(aluno.getNome());
campoTelefone_Celular.setText(aluno.getTelefoneCelular());
        campoEmail.setText(aluno.getEmail());
        preencheCamposTelefone();
    }

    private void preencheCamposTelefone(){
        telefoneList = telefoneDAO.buscaTodosTelefonesAlunos(aluno.getId());

        for (Telefone telefone : telefoneList){
            if(telefone.getTipo() == TipoTelefone.FIXO){
                campoTelefone_Fixo.setText(telefone.getNumero());
            } else {
                campoTelefone_Celular.setText(telefone.getNumero());
            }
        }
    }

    private void finalizaFormulario(){
        preencheAluno();

        Telefone telefoneFixo = getTelefone(campoTelefone_Fixo, TipoTelefone.FIXO);
        Telefone telefoneCelular = getTelefone(campoTelefone_Celular, TipoTelefone.CELULAR);

        if(aluno.temIdValido()) {
            editaAluno(telefoneFixo, telefoneCelular);
        }else{
            salvaAluno(telefoneFixo, telefoneCelular);
        }
        finish();
    }

    @NonNull
    private Telefone getTelefone(EditText campoTelefone_fixo, TipoTelefone fixo){
        String numeroFixo = campoTelefone_fixo.getText().toString();
        return new Telefone(numeroFixo, fixo);
    }

    private void salvaAluno(Telefone telefoneFixo, Telefone telefoneCelular){
        int alunoId = alunoDAO.salva(aluno).intValue(); // intvalue e um metado para devolucao e um conversao do alunoId
        vinculaAlunoTelefone(alunoId,telefoneFixo, telefoneCelular);
        telefoneDAO.salva(telefoneFixo, telefoneCelular);
    }

    private void editaAluno(Telefone telefoneFixo, Telefone telefoneCelular) {
        alunoDAO.edita(aluno);
        vinculaAlunoTelefone(aluno.getId(), telefoneFixo, telefoneCelular);
        atualizaIdTelefones(telefoneFixo, telefoneCelular);
        telefoneDAO.atualizar(telefoneFixo, telefoneCelular);
    }

    private void atualizaIdTelefones(Telefone telefoneFixo, Telefone telefoneCelular) {
        for (Telefone telefone: telefoneList){
            if (telefone.getTipo() == TipoTelefone.FIXO){
                telefoneFixo.setId(telefone.getId());
            }else{
                telefoneCelular.setId(telefone.getId());
            }
        }
    }

    private void vinculaAlunoTelefone(int alunoId, Telefone... telefones) {
        for (Telefone telefone: telefones){
            telefone.setAlunoId(alunoId);
        }
    }

    private void inicializacaoDosCampos(){
        campoNome = findViewById(R.id.activity_formulario_aluno_nome);
//      campoSobrenome = findViewById(R.id.activity_formulario_aluno_sobrenome);
        campoTelefone_Fixo = findViewById(R.id.activity_formulario_aluno_telefone_fixo);
        campoTelefone_Celular = findViewById(R.id.activity_formulario_aluno_telefone_celular);
        campoEmail = findViewById(R.id.activity_formulario_aluno_email);
    }

    public void preencheAluno(){
        String nome = campoNome.getText().toString();
//        String sobrenome =

Aqui em pouco da mensagem que mostra no console:

at br.com.alura.agenda.database.dao.RoomAlunoDAO_Impl.salva(RoomAlunoDAO_Impl.java:105)
        at br.com.alura.agenda.ui.activity.FormularioAlunoActivity.salvaAluno(FormularioAlunoActivity.java:117)
        at br.com.alura.agenda.ui.activity.FormularioAlunoActivity.finalizaFormulario(FormularioAlunoActivity.java:105)
        at br.com.alura.agenda.ui.activity.FormularioAlunoActivity.onOptionsItemSelected(FormularioAlunoActivity.java:58)

Oi Guilherme, tudo bem?

O erro indica que você está usando operações com o banco de dados na thread principal, ou seja, você precisa executar as operações do DAO dentro de uma thread separada. Em aula utilizamos a AsyncTask, portanto, você pode implementar uma AsyncTask que faça a operação com o banco de dados.

solução!

Ja resolvi o problema era que eu estava endicando class AluraDao, e nao interface AlunoDAO.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software