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

Posted

技术标签:

【中文标题】使用 android studio java Recycler 视图从 Firebase 实时数据库中删除一个节点【英文标题】:Delete a node from Firebase realtime database with android studio java Recycler view 【发布时间】:2021-11-23 19:53:33 【问题描述】:

如何获取使用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"

这是我的适配器类:

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);
        
    

这是我的订单类:

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;
    


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

【问题讨论】:

您要删除哪个节点?这个-Ml-I9XVcNnOM8nc79sw 一个? @AlexMamo 是的,这是我要删除的。我想知道删除类似节点的方法是什么。我无法导航到该节点。我可以使用这个导航到由firebase身份验证提供的节点(LP6RF0KD7Ve66snlayZjpSotQEJ2):DatabaseReference db =FirebaseDatabase.getInstance().getReference("Prescription").child(authCode); db.removeValue() 但这会删除整个用户的节点 【参考方案1】:

根据您的评论:

我可以使用以下命令导航到由 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();

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

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

How to get specific pushedID in Firebase?

【讨论】:

以上是关于使用 android studio java Recycler 视图从 Firebase 实时数据库中删除一个节点的主要内容,如果未能解决你的问题,请参考以下文章

Android studio导入项目时的问题(Re-download dependencies and sync project (requires network))

Android Studio 没有完全下载

Android Studio常见问题

Android studio出现这种情况怎么解决?

Android Studio 找不到颜色样式资源

android studio 里面有adb.exe吗?目录在哪里?