Дети не удаляются из firebase. Событие onclick записывается в onbindviewholder в пользовательском классе recyclerview

Интересно то, что тост, написанный при завершении удаления, отображается, но значение из firebase не удаляется.

вот мое изображение пользовательского интерфейса..

enter image description here

вот мой код onbindviewholder...

  public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

        holder.getShopname().setText(list.get(position).getShopname());
        holder.getApmt_date().setText(list.get(position).getAppointment_date());
        Log.d("QWWQ","size="+list.get(position).getServices());
        holder.getServices().setText(list.get(position).getServices().substring(0,list.get(holder.getAdapterPosition()).getServices().indexOf('-'))) ;
        holder.getSlot().setText(list.get(position).getSlot());
        holder.getAmount().setText(list.get(position).getAmount());

        holder.getcancelBtn().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                FirebaseDatabase.getInstance().getReference("Users").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("appointments").addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot snapshot) {
                        for (DataSnapshot datasnapshot: snapshot.getChildren()
                             ) {
                            if(datasnapshot.child("shop_name").getValue(String.class).equals(list.get(holder.getAdapterPosition()).getShopname())){
                                Log.d("CHHH","Users/"+FirebaseAuth.getInstance().getCurrentUser().getUid()+"/"+datasnapshot.getKey()+"/appointment_dates/"+list.get(holder.getAdapterPosition()).getAppointment_date());
                                FirebaseDatabase.getInstance().getReference("Users").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child(datasnapshot.getKey()).child("appointment_dates").child(list.get(holder.getAdapterPosition()).getAppointment_date()).removeValue(new DatabaseReference.CompletionListener() {
                                    @Override
                                    public void onComplete(@Nullable DatabaseError error, @NonNull DatabaseReference ref) {
                                        FirebaseDatabase.getInstance().getReference("Shops").child("appointments").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child(list.get(holder.getAdapterPosition()).getAppointment_date()).removeValue(new DatabaseReference.CompletionListener() {
                                            @Override
                                            public void onComplete(@Nullable DatabaseError error, @NonNull DatabaseReference ref) {
                                                Toast.makeText(view.getContext(), "Your Appointment With "+list.get(holder.getAdapterPosition()).getShopname()+" has been cancelled!!",Toast.LENGTH_SHORT).show();
                                            }
                                        });

                                    }
                                });
                            }
                        }
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError error) {

                    }
                });

            }
        });
    }

Образ базы данных Firebase...

enter image description here

Вы отобразили журнал внутри onDatachange. Можете ли вы сказать, что напечатано?

Sambhav. K 10.04.2022 07:22

D/CHHH: Users/owRf4tqVKkbWHEUQlmrYIsXRxpO2/Sn3g0t2IslZru0cPyoFCWuGgb‌​nV2/appointment_date‌​s/11-4-2022.........‌​..... как видите, путь идеален, и если он был не идеально, тогда сообщение Toast не будет видно, но оно есть.

ROCKY 007 10.04.2022 09:09
Основы программирования на Java
Основы программирования на Java
Java - это высокоуровневый объектно-ориентированный язык программирования, основанный на классах.
Концепции JavaScript, которые вы должны знать как JS программист!
Концепции JavaScript, которые вы должны знать как JS программист!
JavaScript (Js) - это язык программирования, объединяющий HTML и CSS с одной из основных технологий Всемирной паутины. Более 97% веб-сайтов используют...
0
3
31
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать .setValue(null) вместо .removeValue для удаления элемента из базы данных в реальном времени.

нет, это не работает.

ROCKY 007 09.04.2022 18:57
Ответ принят как подходящий

Это помогает не игнорировать ошибки, которые вы получаете от API, которые вы вызываете.

В вызове removeValue вы захотите проверить, не является ли errornull, и записать его:

public void onComplete(@Nullable DatabaseError error, @NonNull DatabaseReference ref) {
    if (error != null) {
        Log.e("Firebase", "Error deleting node", error);
    } else {
        Toast.makeText(view.getContext(), "Your Appointment With "+list.get(holder.getAdapterPosition()).getShopname()+" has been cancelled!!",Toast.LENGTH_SHORT).show();
    }
}

И в вашем слушателе вы никогда не должны оставлять onCancelled пустым. Как минимум это должно быть

@Override
public void onCancelled(@NonNull DatabaseError error) {
    throw error.toException();
}

Как только вы сможете прочитать ошибку, вы сможете узнать, в чем основная причина проблемы.

Я пытался, но по-прежнему не видно ошибки, и я добавил тост в другую часть, и он все еще работает ... можете ли вы сказать мне, о какой ошибке вы говорите?

ROCKY 007 09.04.2022 20:27

Спасибо, что не сказали!! Понятно :)

ROCKY 007 10.04.2022 19:18

Я указываю неправильный путь (путь, который не существует) для удаления этого узла из firebase, поэтому после исправления я получил требуемый результат. (Примечание: если вы укажете неправильный путь, все равно будет запущен Toast, который записан в remove valueoncomplete.)

Другие вопросы по теме