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.
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.