Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Alguem tentou usar sqlite no projeto de notas(Ceep) ?

estou tentando gravar as notas no banco, alias ja consegui... mas nao consegui fazer as outras operacoes ainda, alguem que tenha tentando ai? ou que tenha alguma ideia.. rs

23 respostas

Oi Rafael, tudo bem? Qual operação está tentando fazer e não está conseguindo? Quando acontecer esses problemas pode mandar o código junto, pois é dessa forma que conseguimos investigar e sugerir a possível solução.

[]s

Na hora que eu faco o swipe a aplicacao trava, excluir e reordenar as notas tbm nao foi rs, consegue dar uma olhada no projeto?

Consigo sim, você pode me manda via GitHub?

[]s

eu tenho ele no gitlab.... no hub to tentando a horas aqui e nao saio desse erro tbm rs....

Rafael@Rafael MINGW64 ~/AndroidStudioProjects/Roson/ceep (master)
$ git push -u origin master
error: src refspec master does not match any.
error: failed to push some refs to 'git@github.com/rafaelameilda/ceep.git'

Oi Rafael, se você preferir, pode compartilhar comigo o gitlab também :)

Se o repositório estiver público é só enviar o link que tenho acesso.

[]s

Eai Alex blz, mano acho que consegui subir... https://github.com/rafaelameilda/Ceep

quando tiver um tempo tu olha la rsrs...

Oi Rafael, percebi que você estava migrando para o uso do SQLite, certo?

No ItemTouchHelper, você ainda tá usando o antigo! Isso significa que você precisa usar o novo também, afinal é nele que estão as notas agora.

A minha sugestão para refatoração do código:

  • Remova o DAO antigo;
  • Use o novo nos pontos que usava o antigo, então vai resolvendo os problemas das operações que não funcionarem.

Se você tiver com dúvida em alguma operação em específico aí é só avisar.

[]s

boa tarde galera, alguem sabe como posso montar o excluir corretamente..estou fazendo assim

no NotaItemTouchHelperCallback esta assim

@Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
        int posicaoDaNotaDeslizada = viewHolder.getAdapterPosition();
        removeNota(posicaoDaNotaDeslizada);
    }
    private void removeNota(int posicao) { 
        GeradordeBancodeDados gerador = new GeradordeBancodeDados();
        NotaDataBase notaDataBase = gerador.gera();/*aqui*/
        NotaDaoo notaDaoo = notaDataBase.getNotaDaoo();
        notaDaoo.delete(posicao);/*aqui*/
        adapter.remove(posicao);

e la no dao esta assim

 @Delete
    void delete(Nota nota);

alguma dica pra nois? rs

Oi Rafael, o fluxo é esse mesmo.

Não está removendo a nota? Se possível dê mais detalhes do que acontece na tela, por exemplo:

"Quando exclui não sai da tela, porém ao fechar e abrir o App a nota não aparece mais."

Perceba que dessa forma é até mais fácil de avaliar o possível problema :)

Portanto, compartilha com a gente o que está acontecendo conforme o seu teste.

[]s

Bom dia Alex, entao agora que comecei a montar o deletar a app nem chega a rodar ali no removeNota da erro na seguinte linha

 private void removeNota(int posicao) {
        GeradordeBancodeDados gerador = new GeradordeBancodeDados();
        NotaDataBase notaDataBase = gerador.gera(); /*erro aqui*/

o erro e esse

 error: method gera in class GeradordeBancodeDados cannot be applied to given types;
required: Context
found: no arguments
reason: actual and formal argument lists differ in length

e no final do metodo tbm tem um erro nessa linha

 notaDaoo.delete(posicao);/*aqui*/

o seguinte erro

error: incompatible types: int cannot be converted to Nota

e partindo disso acho que vou ter problemas tambem com o onMove(troca notas ) pq acho que meu problema ai e como estou informando a posicao para excluir.

De acordo com o erro, é necessário o envio de uma referência de Context, então você precisa mandar um contexto para gerar uma conexão com o banco de dados. Ela pode ser recebida via parâmetro do método removeNota(), então, quem o chamar, precisa enviar enviar o contexto.

No último erro, está indicando que os tipos são incompatíveis, pois você está enviando a posição, sendo que o delete() espera uma referência de Note, logo, você precisa pegar a nota do adapter a partir da posição e depois enviar para o delete().

[]s

Alex, o erro no delete parou de reclamr, mas nao tenho certeza se vai funcionar assim,

mas o context ali nao consegui montar.. olha como esta ficando

    private void removeNota(int posicao) {
        GeradordeBancodeDados gerador = new GeradordeBancodeDados();
        NotaDataBase notaDataBase = gerador.gera(removeNota());/*ainda aqui*/
        NotaDaoo notaDaoo = notaDataBase.getNotaDaoo();
        notaDaoo.delete(adapter.remove(posicao));
        adapter.remove(posicao);

No gerador.gera(), você precisa mandar uma instância de Context, por isso está apresentando o erro, nesse caso ficaria da seguinte maneira:

 private void removeNota(Context context, int posicao) {
        GeradordeBancodeDados gerador = new GeradordeBancodeDados();
        NotaDataBase notaDataBase = gerador.gera(context);
        NotaDaoo notaDaoo = notaDataBase.getNotaDaoo();
        notaDaoo.delete(adapter.remove(posicao));
        adapter.remove(posicao);

Tenta fazer esse ajuste e veja se volta a compilar. Só lembra de mandar contexto nos pontos que usam o removeNota().

File Alex o removeNota ta certo agora, mas Como ficaria no onSwiped ? nele eu nao posso passar contexto igual no removeNota

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
        int posicaoDaNotaDeslizada = viewHolder.getAdapterPosition();
        removeNota(/* */,posicaoDaNotaDeslizada);
    }

    private void removeNota(Context context, int posicao) {
        GeradordeBancodeDados gerador = new GeradordeBancodeDados();
        NotaDataBase notaDataBase = gerador.gera(context);
        NotaDaoo notaDaoo = notaDataBase.getNotaDaoo();
        notaDaoo.delete(adapter.remove(posicao));
        adapter.remove(posicao);

Ele vai precisar mandar o Context, ou então, você pode receber o Context via construtor mesmo, dessa forma, você transforma ele em um atributo do ItemTouchHelper e não precisa usar como um parâmetro de método.

Mano desculpa pela transtorno ai, mas nao deu certo ainda, bom o app esta rodando agora mas na hora que eu arrasto pro lado a nota pra apagar a app quebra e da esse erro aqui.

Process: br.com.alura.ceep, PID: 11759
    java.lang.IllegalArgumentException: Cannot provide null context for the database.
        at android.arch.persistence.room.RoomDatabase$Builder.build(RoomDatabase.java:441)
        at br.com.alura.ceep.dao.GeradordeBancodeDados.gera(GeradordeBancodeDados.java:12)
        at br.com.alura.ceep.ui.recyclerview.helper.callback.NotaItemTouchHelperCallback.removeNota(NotaItemTouchHelperCallback.java:54)
        at br.com.alura.ceep.ui.recyclerview.helper.callback.NotaItemTouchHelperCallback.onSwiped(NotaItemTouchHelperCallback.java:49)

Oi Rafael, sem problemas o fórum é pra tirar dúvidas mesmo, fique tranquilo quanto a isso hehe

O erro indica uma referência nula de context, isso significa que o ItemTouchHelper está recebendo uma referência nula de Context.

Pode me mostrar o código que chama o ItemTouchHelper?

[]s

no meu lista notasActivity tem

  private void configuraItemTouchHelper(RecyclerView listaNotas) {
        ItemTouchHelper itemTouchHelper =
                new ItemTouchHelper(new NotaItemTouchHelperCallback(adapter));
        itemTouchHelper.attachToRecyclerView(listaNotas);
    }

e depois o meu NotaItemTouchHelper

public class NotaItemTouchHelperCallback extends Callback {

    private final ListaNotasAdapter adapter;
    private  Context context;

    public NotaItemTouchHelperCallback(ListaNotasAdapter adapter) {
        this.adapter = adapter;
    }

    @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        int marcacoesDeDeslize = ItemTouchHelper.RIGHT | ItemTouchHelper.LEFT;
        int marcacoesDeArrastar = ItemTouchHelper.DOWN | ItemTouchHelper.UP
                | ItemTouchHelper.RIGHT | ItemTouchHelper.LEFT;
        return makeMovementFlags(marcacoesDeArrastar, marcacoesDeDeslize);
    }

    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        int posicaoInicial = viewHolder.getAdapterPosition();
        int posicaoFinal = target.getAdapterPosition();
        trocaNotas(posicaoInicial, posicaoFinal);
        return true;
    }

    private void trocaNotas(int posicaoInicial, int posicaoFinal) {
        new NotaDAO().troca(posicaoInicial, posicaoFinal);
        adapter.troca(posicaoInicial, posicaoFinal);
    }

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
        int posicaoDaNotaDeslizada = viewHolder.getAdapterPosition();
        removeNota(context,posicaoDaNotaDeslizada);
    }

    private void removeNota(Context context, int posicao) {
        GeradordeBancodeDados gerador = new GeradordeBancodeDados();
        NotaDataBase notaDataBase = (NotaDataBase) gerador.gera(context).getNotaDaoo();
        NotaDaoo notaDaoo = notaDataBase.getNotaDaoo();
        notaDaoo.delete(adapter.remove(posicao));
        adapter.remove(posicao);

//        new NotaDAO().remove(posicao);
//        adapter.remove(posicao);
    }
}

Oi Rafael, veja que você tem um atributo de Context que não é inicializado, portanto, você precisa receber via construtor do NotaItemTouchHelperCallback e fazer a inicialização dele:

    private final ListaNotasAdapter adapter;
    private  Context context;

    public NotaItemTouchHelperCallback(Context context, ListaNotasAdapter adapter) {
        this.adapter = adapter;
    this.context = context;
    }

Dessa forma, você não precisa mais dos parâmetros de Context nos métodos do NotaItemTouchHelperCallback e pode usar direto o atributo.

No configuraItemTouchHelper() você envia a referência válida de Context como argumento.

Caramba, depois de tanto trabalho ta excluindo ja(alias vlw Alex ) , so que algumas vezes da erro ao excluir algo na lista(nao e sempre) e fecha a aplicação e ele tambem nao esta reorganizando ao excluir, so reorganiza a lista no oncreate e no onresume.

como posso tentar ver isso tambem?

No ListaNotasAdapter esta assim:

public Nota remove(int posicao) {
       return notas.remove(posicao);
    }

no NotaItemTouchHelperCallback esta assim:

 @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
        int posicaoDaNotaDeslizada = viewHolder.getAdapterPosition();
        removeNota(posicaoDaNotaDeslizada);
    }

    private void removeNota( int posicao) {
        GeradordeBancodeDados gerador = new GeradordeBancodeDados();
        NotaDataBase notaDataBase =  gerador.gera(context);
        NotaDaoo notaDaoo = notaDataBase.getNotaDaoo();
        notaDaoo.delete(adapter.remove(posicao));
        adapter.remove(posicao);

    }

e o dao

  @Delete
    void delete(Nota nota);

Que bom que a primeira parte foi resolvida hehe

Sobre o erro, a primeira coisa que preciso saber é o erro apresentado no logcat quando o App quebra, um detalhe que estou vendo logo de cara, é que está faltando a notificação no adapter falando que uma nota foi removida. você pode fazer isso chamando o notifyItemRemoved() que recebe a posição do item removido do dataset.

É válido mencionar que você pode explorar os problemas colocando logs, para verificar, por exemplo, os valores dos atributos da nota quando é excluída e assim por diante. É muito comum esse tipo de abordagem durante uma investigação de problemas.

O debugging também é uma alternativa que ajuda muito na investigação. É bem similar ao que vemos no curso de IntelliJ inclusive. Costumo usar bastante em códigos que não tenho domínio.

[]s

Deixei meu adapter assim

    public Nota remove(int posicao) {
       notifyItemRemoved(posicao);
        return notas.remove(posicao);
    }

o erro que esta dando agora e :

2019-01-31 15:31:36.454 27770-27770/
ceep E/AndroidRuntime: FATAL EXCEPTION: main
    Process: ceep, PID: 27770
    java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
        at java.util.ArrayList.remove(ArrayList.java:477)
        at ceep.ui.recyclerview.adapter.ListaNotasAdapter.remove(ListaNotasAdapter.java:59)
        at ceep.ui.recyclerview.helper.callback.NotaItemTouchHelperCallback.removeNota(NotaItemTouchHelperCallback.java:58)
        at ceep.ui.recyclerview.helper.callback.NotaItemTouchHelperCallback.onSwiped(NotaItemTouchHelperCallback.java:50)
solução

Oi Rafael, no Adapter, primeiro faça a remoção no dataset para depois notificar a remoção. Sobre o erro apresentado, ele está indicando que você está tentando acessar uma posição que excede o limite de elementos contido na lista.

Nesse caso, é preciso investigar, você pode fazer isso colocando logs, por exemplo, ao remover a nota, você pode conferir a posição que está sendo recebida e a quantidade de notas contidas na lista de notas do adapter.

Muito provavelmente é a posição que está com problema, ou seja, vai precisar conferir o código e ajustá-lo para que mande uma posição esperada.

Lembre-se de colocar logs para entender os valores de cada variável, dessa forma, facilita a compreensão do que está acontecendo no fluxo do App para depois tomar uma ação de manutenção.

[]s