1
resposta

Como eu posso fazer em room?

Observe o código do projeto do curso!

public void insere(Aluno aluno) {
    SQLiteDatabase db = getWritableDatabase();
    insereIdSeNecessario(aluno);
    ContentValues dados = pegaDadosDoAluno(aluno);
    db.insert("Alunos", null, dados);
}

private void insereIdSeNecessario(Aluno aluno) {
    if(aluno.getId() ==null) {
        aluno.setId(geraUUID());
    }
}


public void sincroniza(List<Aluno> alunos) {
    for (Aluno aluno :
            alunos) {
        if (existe(aluno)) {
            altera(aluno);
        } else {
            insere(aluno);
        }
    }
}

private boolean existe(Aluno aluno) {
    SQLiteDatabase db = getReadableDatabase();
    String existe = "SELECT id FROM Alunos WHERE id=? LIMIT 1";
    Cursor cursor = db.rawQuery(existe, new String[]{aluno.getId()});
    int quantidade = cursor.getCount();
    return quantidade > 0;
}

Eu estou tentando fazer com Room, no meu projeto a minha classe ListaAlunosActivity está assim;

@Override
protected void onResume() {
    AlunoDAO alunoDAO;
    AgendaDatabase database = AgendaDatabase.getInstance(this);
    alunoDAO = database.getRoomAlunoDAO();

    super.onResume();
    Call<List<Aluno>> call = new RetrofitInializador().getAlunoService().lista();
    call.enqueue(new Callback<List<Aluno>>() {
        @Override
        public void onResponse(Call<List<Aluno>> call, Response<List<Aluno>> response) {
            List<Aluno> alunos = response.body();

            alunoDAO.insere(alunos);
        }

        @Override
        public void onFailure(Call<List<Aluno>> call, Throwable t) {

        }
    });
    listaAlunosView.atualizaAlunos();
}

E minha classe AlunoDAO tentei dessa forma;

@Dao public interface AlunoDAO {

@Insert
Long salva(Aluno aluno);

@Query("SELECT * FROM Aluno")
List<Aluno> todos();

@Delete
void remove(Aluno aluno);

@Update
void edita(Aluno aluno);

@Query("SELECT * FROM Aluno")
void insere(List<Aluno> alunos);

}

Por favor quais são as alterações que deveria fazer na minha classe AlunoDAO em modelo Room poderia ficar para seguir a mesma intensão do projeto do curso?

1 resposta

Oi Wladimir, tudo bem? O seu insere na verdade está fazendo um select na tabela de alunos. O que é o contrário do que você está querendo fazer.

A minha sugestão é que você tente usar o método salva, simplificando seu código, pode ficar assim:

public void onResponse(Call<List<Aluno>> call, Response<List<Aluno>> response) {
    List<Aluno> alunos = response.body();
     for (Aluno aluno : alunos) {
        alunoDAO.salva(aluno);
    }
}

E você pode apagar da interface, o método insere.