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.
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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.
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.
Ja resolvi o problema era que eu estava endicando class AluraDao, e nao interface AlunoDAO.