![](/img/trans.png)
[英]Recycler View not updating messages from Firebase Database: Android Studio
[英]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.