Black November

ATÉ 50% OFF

TÁ ACABANDO!

0 dias

0 horas

0 min

0 seg

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

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

Matricule-se agora e aproveite até 50% OFF

O maior desconto do ano para você evoluir com a maior escola de tecnologia

QUERO APROVEITAR
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