繁体   English   中英

使用 android studio java Recycler 视图从 Firebase 实时数据库中删除一个节点

[英]Delete a node from Firebase realtime database with android studio java Recycler view

在将数据插入数据库以对节点应用删除方法时,如何获取使用push().getKey()插入的子 ID? 我使用recyclerView将数据显示为卡片。

这是我的 Firebase 数据库:

Prescription
   -MkWDI1v55zkQDdiGa8T
   -MkXdxxXLoJgFJVQYDpo
      -LP6RF0KD7Ve66snlayZjpSotQEJ2   //This is a unique ID that is provided by firebase authentication
         -Ml-I9XVcNnOM8nc79sw         //This is the Ordered Item 1
             name: "Atarax"
             qty: "30"
             total: "300.00"
             unitPrice: "10.00"
         -Ml-M1pN4zsyyRf7pHeM         //This is the Ordered Item 2
             name: "Vitamin C"
             qty: "10"
             total: "500.00"
             unitPrice: "50.00"

这是我的适配器 class:

public class Cart_adapter extends RecyclerView.Adapter<Cart_adapter.MyViewHolder> {

    SpinKitView pbDelete;
    Context context;
    ArrayList<Orders> list;
    DatabaseReference reference;


    public Cart_adapter(Context context, ArrayList<Orders> list, SpinKitView pbDelete) {
        this.context = context;
        this.list = list;
        this.pbDelete = pbDelete;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(context).inflate(R.layout.order, parent, false);
        return new MyViewHolder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull final MyViewHolder holder, int position) {
        Orders order = list.get(position);
        holder.iname.setText(order.getName());
        holder.qty.setText(order.getQty());
        holder.unitPrice.setText(order.getUnitPrice());
        holder.totPrice.setText(order.getTotal());




        //Delete from Firebase Database
        holder.btn_delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                pbDelete.setVisibility(View.VISIBLE);

                String key = FirebaseAuth.getInstance().getCurrentUser().getUid().toString();
                
                reference = FirebaseDatabase.getInstance().getReference("Prescription").child(key);
                
                FirebaseDatabase.getInstance().getReference("Prescription").child(key)
                        .child(reference.getKey().toString()).removeValue();
            }
        });
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    public static class MyViewHolder extends RecyclerView.ViewHolder{

        TextView iname, qty, unitPrice, totPrice;
        Button btn_delete;
        LinearLayout orderCard;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);

            iname = itemView.findViewById(R.id.tv_itemName);
            qty = itemView.findViewById(R.id.tv_qty);
            unitPrice = itemView.findViewById(R.id.tv_unitPrice);
            totPrice = itemView.findViewById(R.id.tv_totalPrice);
            btn_delete = itemView.findViewById(R.id.btn_remove);
            orderCard = itemView.findViewById(R.id.layout_order);
        }
    }

这是我的订单 class:

package com.edu.wellwork;

public class Orders{

    public String name;
    public String qty;
    public String unitPrice;
    public String total;

    public Orders() {
    }

    public Orders(String name, String qty, String unitPrice, String total) {
        this.name = name;
        this.qty = qty;
        this.unitPrice = unitPrice;
        this.total = total;
    }

    public Orders(String itemName, String qty) {
        this.name = itemName;
        this.qty = qty;
    }

    public String getName() {
        return name;
    }

    public String getQty() {
        return qty;
    }

    public String getUnitPrice() {
        return unitPrice;
    }

    public String getTotal() {
        return total;
    }
}

如何获取唯一键(即每个订单的父节点)以从数据库中删除已订购的商品?

根据您的评论:

我可以使用以下方法导航到 firebase 身份验证 (LP6RF0KD7Ve66snlayZjpSotQEJ2) 提供的节点:DatabaseReference db =FirebaseDatabase.getInstance().getReference("Prescription").child(authCode); db.removeValue() 但是这会删除整个用户的节点

实际上,您正在删除整个节点,因为您的引用恰好指向该节点。 为了能够删除-Ml-I9XVcNnOM8nc79sw节点,您应该创建一个精确指向该节点的引用:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference nodeToRemove = rootRef
    .child("Prescription")
    .child("-MkXdxxXLoJgFJVQYDpo")
    .child("-LP6RF0KD7Ve66snlayZjpSotQEJ2")
    .child("-Ml-I9XVcNnOM8nc79sw");
nodeToRemove.removeValue();

永远记住,为了删除特定元素,您需要创建一个包含所有节点名称的引用,包括您要删除的节点。

如果您没有其中一个键,那么您应该将值存储在一个变量中,如我在以下帖子中的回答中所述:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM