【问题标题】:How to delete push key data from Firebase in Android Studio如何在 Android Studio 中从 Firebase 中删除推送密钥数据
【发布时间】:2020-12-17 06:11:30
【问题描述】:

我可以知道如何删除 UserID 按键下的数据吗?目前,我正在使用 firebase,我需要删除 UserID 下的特定预订数据。例如,我想删除整个 MOjF8qthpvBGrbZMtBS 数据,但是一旦我单击删除按钮,所有数据也会被删除。请帮忙;')

public class BookingAdapterRecyclerView  extends 
RecyclerView.Adapter<BookingAdapterRecyclerView.MyViewHolder>{
private List<Booking>bookingList;
private Activity mActivity;


public class MyViewHolder extends RecyclerView.ViewHolder{
    public LinearLayout rl_layout;
    public TextView 
    tvname,tvphone,tvhouse,tvdate,tvtime,tvstatus,tvremarks;
    public RadioGroup radioGroup;
    public Button bDelete, bVerify;

    public MyViewHolder (View view){
        super(view);
        rl_layout = view.findViewById(R.id.rl_layout);


        tvname = view.findViewById(R.id.tv_name);
        tvphone = view.findViewById(R.id.tv_phone);
        tvhouse = view.findViewById(R.id.tv_house);
        tvdate = view.findViewById(R.id.tv_date);
        tvtime = view.findViewById(R.id.tv_time);
        tvstatus = view.findViewById(R.id.tv_status);
        tvremarks = view.findViewById(R.id.tv_remarks);
        bDelete = view.findViewById(R.id.delete_item);
        bVerify = view.findViewById(R.id.btn_verify);
    }
}

public BookingAdapterRecyclerView(List<Booking>bookingList,Activity 
activity){
    this.bookingList = bookingList;
    this.mActivity = activity;
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.bookinglist_item, parent, false);

    return new MyViewHolder(itemView);
}

@Override
public void onBindViewHolder(MyViewHolder holder, final int position) {
    final Booking book = bookingList.get(position);

    holder.tvname.setText("Name :" + book.getName());
    holder.tvphone.setText("Phone Number :"+book.getPhone());
    holder.tvhouse.setText("House Address :"+book.getHouse());
    holder.tvdate.setText("Date Booking :"+book.getbDate());
    holder.tvtime.setText("Time Booking"+book.getbTime());

这是我的删除功能

    holder.bDelete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            FirebaseDatabase.getInstance().getReference()
                    .child("Booking")
                    .addListenerForSingleValueEvent(new 
ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot 
dataSnapshot) {
                            for (DataSnapshot userSnapshot : 
dataSnapshot.getChildren()){
                                    book.getKey();
                                    userSnapshot.getRef().removeValue();
                            }
                        }

                    });
        }
    });}

}

【问题讨论】:

  • 在 Stack Overflow 上,请不要显示文字和代码的图片。将文本复制到问题本身并设置格式,以便于阅读、复制和搜索。您可以使用底部的编辑链接编辑问题以更正此问题。
  • 您必须提供有关预订日期或类似内容的代码的更多详细信息
  • 提供firebase树结构来理解实际问题
  • 上面的代码看起来像一个recyclerview代码。请发布活动代码,我为此提供更改可能会帮助您获得孩子的钥匙
  • 我要求的是活动代码而不是 recyclerview 代码,因为我们还需要获取孩子的 ID

标签: java android firebase firebase-realtime-database


【解决方案1】:

您的 for 循环将删除每条记录,因为不存在删除特定记录的 if 条件,以便在 for 循环中删除该特定记录

@Override
public void onDataChange(DataSnapshot dataSnapshot) {
     for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) // userSnapshot contains userId
     {          
          if (userSnapshot == userId) // check userId credential
          {
               for (DataSnapshot bookSnapshot : userSnapshot.getChildren()) // it will fetch every book record in db
               {  
                    if(bookSnapshot.getChildren() == "MOjF8qthpvBGrbZMtBS")
                    {
                         userSnapshot.getChildren().removeValue();
                    }
                }
          }   
     }
}

不确定语法但逻辑在这里

【讨论】:

    【解决方案2】:

    您需要执行以下操作:

    FirebaseDatabase.getInstance().getReference().child("Booking").addListenerForSingleValueEvent(new ValueEventListener() {
              @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
              for (DataSnapshot userSnapshot : dataSnapshot.getChildren()){
                   for(DataSnapshot subSnapshot : userSnapshot.getChildren()){
                      subSnapshot.getRef().removeValue();
                 }
             }
            });
            }
        });}
    
    }
    

    如果您无权访问userId,则需要迭代两次,然后使用getRef().removeValue(),您将能够删除随机id及其下的数据。


    如果您可以访问userid,那么只需执行以下操作:

    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
    FirebaseDatabase.getInstance().getReference().child("Booking").child(user.getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
    
    

    getCurrentUser() 返回当前登录的用户。

    你需要引用userId,然后循环一次,它会删除userId下的数据。

    【讨论】:

    • 先生,如果管理员想删除数据怎么办?还是一样吗?我在用户端尝试这个。它可以工作.. 但是当我在管理员端使用它来删除预订数据时.. 它不起作用。
    • 如果在管理员端,则管理员是当前登录用户。您需要有权访问用户 ID。如果您无权访问它,那么您必须像我在第一个 sn-p 中显示的那样循环两次。
    猜你喜欢
    • 1970-01-01
    • 2020-08-10
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多