java - 在 recyclerview 中选择项目时如何从 Firebase 中删除值?

标签 java android firebase firebase-realtime-database android-recyclerview

我的应用程序正在 recyclerview 中显示用户的类。当用户选择特定类别时,它会打开另一个显示详细信息的 Activity ,并且有一个按钮可供用户删除该类别。单击该按钮时,我希望删除保存在用户的类列表下的类的 ID。我还希望将用户的 uid 从类(class)下的学生列表中删除。另外,我不小心将类(class) id 保存为变量名 uid,这不应该与用户的 uid 混淆。如果您有任何疑问,请告诉我! 这是我的数据库结构:

   {
  "Classes" : {
"-LiGRe3e1YF_HFrHKMgi" : {
  "Students" : {
    "-LiId4URjJ8SWLAP4f4i" : "UhTQgJ4jugMqFtEZK8CsIkTqQl22",
    "-LiIeT5t1T7JpcUee_MJ" : "UhTQgJ4jugMqFtEZK8CsIkTqQl22"
  },
  "class_info" : {
    "date_clasname" : "mm",
    "room_number" : "jjhh",
    "subject" : "Science",
    "teacher" : "mm",
    "uid" : "-LiGRe3e1YF_HFrHKMgi"
  }
 }
},
 "Users" : {
"UhTQgJ4jugMqFtEZK8CsIkTqQl22" : {
  "Classes" : {
    "-LiIeT5slTjC0B3lEqNJ" : "-LiGRe3e1YF_HFrHKMgi"
    "-LiIeT5slTjC0B3lEqNJ" : "-LiGRe3e1YF_HFrHKMgi"
  },
  "User_info" : {
    "email" : "samuelford48@gmail.com",
    "grade" : "12",
    "name" : "Samuel"
      }
     }
   }
 }

以下是我的 Activity 的代码,用于显示类并从 Firebase 获取数据:

public class home_fragment extends Fragment implements View.OnClickListener {
private Button button;
//DatabaseReference dref;
//ListView listview2;
//ArrayList<String> list=new ArrayList<>();
private FirebaseDatabase database;
private DatabaseReference myRef;
private List<Listdata> list;
private RecyclerView recyclerview;
public home_fragment() {

}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.home_fragment, container, false);
    //FirebaseUser fbUser = FirebaseAuth.getInstance().getCurrentUser();
    //if(fbUser == null) { Intent intent = new Intent(getContext(), LoginActivity.class);
    // startActivity(intent);}

    button = (Button) view.findViewById(R.id.button);
    button.setOnClickListener(this);
    recyclerview = (RecyclerView) view.findViewById(R.id.rview);
    database = FirebaseDatabase.getInstance();
    myRef = database.getReference("Users")
            .child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("Classes");
    myRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(@NonNull DataSnapshot dataSnapshot, String s) {

            list = new ArrayList<>();
            final adapter_user_remove_class recycler = new adapter_user_remove_class(list);
          //  final RecyclerviewAdapter2 recycler = new RecyclerviewAdapter2(list);
//String postkey2 = dataSnapshot.getKey();

            String class_id = dataSnapshot.getValue(String.class);

            myRef = database.getReference("Classes").child(class_id).child("class_info");
            // StringBuffer stringbuffer = new StringBuffer();
            myRef.addValueEventListener(new ValueEventListener() {

                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) 
{

                        Class_model new_class = dataSnapshot.getValue(Class_model.class);
                        assert new_class != null;
                        String nameofclass = new_class.getDate_clasname();
                        String teacherofclass = new_class.getTeacher();
                        String roomnumberofclass = new_class.getRoom_number();
                        String class_key = new_class.getUid();
                        Listdata listdata = new Listdata(nameofclass, teacherofclass, roomnumberofclass, class_key);
                        //String name = userdetails.getName();
                        //String email = userdetails.getEmail();
                        //String address = userdetails.getAddress();
                        listdata.setDate_class(nameofclass);
                        listdata.setTeacher(teacherofclass);
                        listdata.setRnumber(roomnumberofclass);
                   // recycler.notifyDataSetChanged();
                        list.add(listdata);
                    recycler.notifyDataSetChanged();
                        //recycler.notifyDataSetChanged();// Toast.makeText(MainActivity.this,""+name,Toast.LENGTH_LONG).show();

                }


                @Override
                public void onCancelled(DatabaseError error) {
                    AlertDialog alertDialog = new AlertDialog.Builder(getContext()).create();
                    alertDialog.setTitle("Error");
                    alertDialog.setMessage("Check your connection! If, problem persists please email svhsdev@vigoschools.org!");
                    alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int which) {
                                    dialog.dismiss();
                                }
                            });
                    alertDialog.show();
                }

            });


            RecyclerView.LayoutManager layoutmanager = new LinearLayoutManager(getContext());
            recyclerview.setLayoutManager(layoutmanager);
            recyclerview.setItemAnimator(new DefaultItemAnimator());
            recyclerview.setAdapter(recycler);

        }
        @Override
        public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}

        @Override
        public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

        }
        @Override
        public void onCancelled(DatabaseError error) {
            AlertDialog alertDialog = new AlertDialog.Builder(getContext()).create();
            alertDialog.setTitle("Error");
            alertDialog.setMessage("Check your connection! If, problem persists please email svhsdev@vigoschools.org!");
            alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                        }
                    });
            alertDialog.show();
        }

    });
    return view;
}

这是我的回收器适配器的代码:

public class adapter_user_remove_class extends RecyclerView.Adapter<adapter_user_remove_class.MyHolder>{

List<Listdata> listdata;

public adapter_user_remove_class(List<Listdata> listdata) {
    this.listdata = listdata;
}

@Override
public adapter_user_remove_class.MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview_class_model,parent,false);

    adapter_user_remove_class.MyHolder myHolder = new adapter_user_remove_class.MyHolder(view);
    return myHolder;
}


public void onBindViewHolder(adapter_user_remove_class.MyHolder holder, final int position) {

    final Listdata data = listdata.get(position);
    holder.vdate_class.setText(data.getDate_class());
    holder.vteacher.setText(data.getTeacher());
    holder.vrnumber.setText(data.getRnumber());
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick( final View view) {
            Context context = view.getContext();
            Intent intent = new Intent(context, user_remove_class.class);
            intent.putExtra("date_class", listdata.get(position).getDate_class());
             intent.putExtra("teacher", listdata.get(position).getTeacher());
             intent.putExtra("room_number", listdata.get(position).getRnumber());
            intent.putExtra("post_key", listdata.get(position).getUid());
            context.startActivity(intent);
        }
    });

}

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


class MyHolder extends RecyclerView.ViewHolder{
    TextView vdate_class , vteacher,vrnumber;

    public MyHolder(View itemView) {
        super(itemView);
        vdate_class = (TextView) itemView.findViewById(R.id.date_class_name);
        vteacher = (TextView) itemView.findViewById(R.id.teacher);
        vrnumber = (TextView) itemView.findViewById(R.id.room_number);

    }
  }

}

以下是显示详细信息并处理从 Firebase 中删除数据的 Activity 的代码:

public class user_remove_class extends AppCompatActivity {
private Button remove_class;
private FirebaseDatabase database;
private DatabaseReference myRef, myRef2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_user_remove_class);
    final String date_class2 = getIntent().getStringExtra("date_class");
    final String teacher = getIntent().getStringExtra("teacher");
    final String room_number = getIntent().getStringExtra("room_number");
    final String post_key = getIntent().getStringExtra("post_key");
    TextView display_class_name = (TextView) findViewById(R.id.date_tv);
    display_class_name.setText(date_class2);
    TextView display_teacher = (TextView) findViewById(R.id.teacher_tv);
    display_teacher.setText(teacher);
    TextView display_room_number = (TextView) findViewById(R.id.rn_tv);
    display_room_number.setText(room_number);
    database = FirebaseDatabase.getInstance();
    myRef = database.getReference("Users").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("Classes");

    remove_class = (Button) findViewById(R.id.add_class_2);
  //  final Query query = myRef.orderByChild("classes").equalTo(post_key);
    //System.out.println(query);
    remove_class.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            myRef = database.getReference("Users").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("Classes");
        }
    });
 }
}

最佳答案

您可以通过以下方式删除它:

  remove_class.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                myRef = database.getReference("Users").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("Classes").child(post_key);
myRef.removeValue();
            }
        });

您可以通过此方法检索随 secret 钥。

MyRef.orderByChild("email").equalTo("blabla@blabla.com").addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot child: dataSnapshot.getChildren()) {
            Log.d("User key", child.getKey());
            Log.d("User ref", child.getRef().toString());
            Log.d("User val", child.getValue().toString());
        }
    }

请注意,您必须通过 putExtra 方法传递电子邮件,然后将其与 equalTo(); 方法匹配。如果电子邮件以随 secret 钥存在,它将简单地检索随 secret 钥。 :)

希望它能起作用。如果有效,请不要忘记接受问题。

关于java - 在 recyclerview 中选择项目时如何从 Firebase 中删除值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56814468/

相关文章:

Java : Is my method thread safe?

java - 在vlcj中,AudioTrackInfo得到的 "level"是什么?

android - 计算 Android/iPhone 应用程序的功耗 (mW)

swift - Xcode 火力地堡 |无法将类型“AuthDataResult”的值转换为预期的参数类型 'User'

firebase - 尝试实现Cloud Firestore时,Flutter构建失败,卡在 'pod install’中

java - 获取参数修饰符反射

android - 在 `adb forward` 和 `usbmuxd` 的情况下,谁应该是 socket 服务器,谁应该是客户端

android - 如何在android中实现触摸和滑动事件

swift - 如何在 Swift 3 中将多值数据保存到 Firebase 中?

java - NotifyAll 无法正常工作 : program to control thread execution order - print integers sequentially