Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Can';t从recyclerview实时数据库中删除项目_Android_Firebase_Firebase Realtime Database_Android Recyclerview - Fatal编程技术网

Android Can';t从recyclerview实时数据库中删除项目

Android Can';t从recyclerview实时数据库中删除项目,android,firebase,firebase-realtime-database,android-recyclerview,Android,Firebase,Firebase Realtime Database,Android Recyclerview,我正在尝试设置一种方法从firebase Realtime数据库中永久删除一个项目,但由于某些原因,我不断收到一个错误,该错误表示“getRef”不存在,尽管许多人使用相同的方法删除项目,但我尝试阅读并尝试了多篇文章中的解决方案,但它并没有真正起作用,这是我的适配器类代码,其中错误为: public class AdminAdapterCalories extends RecyclerView.Adapter<AdminAdapterCalories.MYViewHolder> {

我正在尝试设置一种方法从firebase Realtime数据库中永久删除一个项目,但由于某些原因,我不断收到一个错误,该错误表示“getRef”不存在,尽管许多人使用相同的方法删除项目,但我尝试阅读并尝试了多篇文章中的解决方案,但它并没有真正起作用,这是我的适配器类代码,其中错误为:

public class AdminAdapterCalories extends RecyclerView.Adapter<AdminAdapterCalories.MYViewHolder> {

    ArrayList<Calories> nlist;
    public AdminAdapterCalories(ArrayList<Calories> nlist){
        this.nlist=nlist;
    }

    @NonNull
    @Override
    public MYViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.admin_card_calorie,parent,false);
        return new MYViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MYViewHolder holder, int position) {
        holder.food.setText(nlist.get(position).getName());
        holder.calories.setText("Calories : "+nlist.get(position).getCalories());
        holder.proteins.setText("Proteins : "+nlist.get(position).getProteins());
        Picasso.get().load(nlist.get(position).getImage()).into(holder.imge);
        holder.delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder builder=new AlertDialog.Builder(holder.imge.getContext());
                builder.setTitle("Delete Panel");
                builder.setMessage("Are You Sure You Want To Delete?");
                builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        FirebaseDatabase.getInstance().getReference().child("Food")
                                .child(getRef(position).getkey()).removeValue();
                    }
                });

                builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {

                    }
                });

                builder.show();
            }
        });

    }

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

    class MYViewHolder extends RecyclerView.ViewHolder {
        TextView food,calories,proteins;
        ImageView imge,edit,delete;

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

            food= itemView.findViewById(R.id.food_card_admn);
            calories=itemView.findViewById(R.id.caloiries_admin);
            proteins=itemView.findViewById(R.id.proteins_admin);
            imge=itemView.findViewById(R.id.profile_image_card_admin);

            delete=(ImageView)itemView.findViewById(R.id.IvD);
        }
    }
}
这就是数据库的外观 这就是我生成id的方式

您需要在
carries
中使用成员变量存储项目ID,并为其创建getter和setter

public class Calories {

   private String id;
   public String getId() {return id;}
   public String setId(String id) {this.id = id;}
//....
然后在
RecyclerView
中选择需要删除的项目时,获取该项目的id,如:

builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialogInterface, int i) {

        String id = nlist.get(position).getId();
        FirebaseDatabase.getInstance().getReference().child("Food")
                .child(id).removeValue();
    }
});
更新:

当您在firebase控制台上手动设置键时,您可以随时使用
ValueEventListener从firebase抓取
食物列表

并使用
getKey()
方法获取每个项目的密钥:

List<Calories> caloryList = new ArrayList();

ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

        if (dataSnapshot.exists()) {
                
            for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) {
                String id = singleSnapshot.getKey();
                Calories calory = singleSnapshot.getValue(Calories.class);
                calory.setId(id);
                caloryList.add(calory);
            }
        }

    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
    }
};

DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Food");
ref.addValueEventListener(valueEventListener); 
List caloryList=new ArrayList();
ValueEventListener ValueEventListener=新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
if(dataSnapshot.exists()){
对于(DataSnapshot singleSnapshot:DataSnapshot.getChildren()){
String id=singleSnapshot.getKey();
卡路里calory=singleSnapshot.getValue(carries.class);
计算setId(id);
caloryList.add(calory);
}
}
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
};
DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child(“食物”);
参考addValueEventListener(valueEventListener);

最后,
caloryList
应该传递给
RecyclerView
适配器。

您能分享更多错误跟踪吗?因此,不清楚抛出的异常是什么。@除我在执行之前得到错误外,没有其他错误:无法解析方法'getRef'getResf()不是预定义的方法。您只需传递“key”即可删除。@johnh我如何传递它?每当我搜索密钥时,他们总是使用getref来获取@AndroidLearner您是否将密钥作为成员变量存储在
Carries
类中?我尝试过这样做,当我尝试删除
java.lang.NullPointerException时,他们给了我以下错误:无法为child()中的参数“pathString”传递nullcom.google.firebase.database.DatabaseReference.child(DatabaseReference.java:96)net.smallacademy.authenticatorapp.adminaptercalories$1.onClick(adminaptercalories.java:55)
@john这意味着
id
null
,您是否在
nlist
中的
对象上设置了id。。这也应该映射到相应的firebase数据库不,我没有,因为id不是edittext或它没有名字,比如卡路里蛋白质等,所以我不知道如何在firebase上生成这些id,比如
01
02
?当您这样做时,您需要将它们设置为
卡路里
对象,然后再将它们保存到firebase中database@john例如,您可以尝试使用
FirebaseDatabase.getInstance().getReference().child(“食物”).child(“01”).removeValue()然后检查firebase控制台上是否删除了此项目
  //First get key before store data in database.
    
    String key = mDatabaseRef.child("Food").push().getKey();
    
    //store this key in model class for later use.(delete)
    
    yourModelClass.setMyKey(key);
    yourModelClass.set(allOtherValues);
    
    //then store in database.
    
    mDatabase.child("Food").child(key).setValue(yourModelClass);
    
    //then delete data using "key".
    
    FirebaseDatabase.getInstance().getReference().child("Food")
                                    
   .child(yourModelClass.getMyKey()).removeValue();

    //getMyKey() is just getter method returns stored key.
  //First get key before store data in database.
    
    String key = mDatabaseRef.child("Food").push().getKey();
    
    //store this key in model class for later use.(delete)
    
    yourModelClass.setMyKey(key);
    yourModelClass.set(allOtherValues);
    
    //then store in database.
    
    mDatabase.child("Food").child(key).setValue(yourModelClass);
    
    //then delete data using "key".
    
    FirebaseDatabase.getInstance().getReference().child("Food")
                                    
   .child(yourModelClass.getMyKey()).removeValue();

    //getMyKey() is just getter method returns stored key.