android 如何检查当前快照键是否存在于同一数据库的不同部分中

i5desfxk  于 2023-04-28  发布在  Android
关注(0)|答案(1)|浏览(79)

我希望检查addChildEventListener中的snapshot.getKey()是否存在于同一数据库中的不同路径中。
我在数据库中有两棵树,它们是否喜欢活动由一个true或false表示,活动ID作为关键字

{
  "Activity": {
    "Do": {
      "-NTW-cLFvmgSqZ72EKuJ": {
        "name": "kayaking "
         },
      "-NTW-u8LJKsGd-wpcmir": {
        "name": "climbing "
      }
      
  },
  "Users": {
    "wkFbhmSH6lfPkkyy6OGke0be1ys2": {
      "gender": "Male",
      "preferences": {
        "Do": {
          "-NTW-cLFvmgSqZ72EKuJ": true}
        }
    }
  }
}

我想调查用户,询问他们是否喜欢该活动,但我只想问他们是否以前没有回答过这个问题。
为此,我使用了以下事件侦听器,它为所有活动填充问题卡

DatabaseReference selectedActivityDatabase = FirebaseDatabase.getInstance().getReference().child("Activity").child("Do");
        selectedActivityDatabase.addChildEventListener(new ChildEventListener() {

            @Override
            public void onChildAdded(@NonNull DataSnapshot activitySnapshot, @Nullable String previousChildName) {
                if (activitySnapshot.exists()){
                    currentActivityId = activitySnapshot.getKey();

                    cards item = new cards(activitySnapshot.getKey(),activitySnapshot.child("name").getValue().toString());
                    rowItems.add(item);
                    String key = activitySnapshot.getKey();
                    activityTpeArrayAdapter.notifyDataSetChanged();
                }
            }

我想检查activitySnapshot.getKey()是否在users.child(“Do”).child(“preferences”)中,但我不知道如何将activitySnapshot.getKey()传递到在数据库的“Users”树中进行检查的侦听器中
我尝试了许多侦听器,并尝试设置一个全局变量来存储活动ID并检查它是否存在于单独的函数中,但无法理解侦听器的复杂性以及如何向它们传递变量

46qrfjad

46qrfjad1#

我不明白如何将activitySnapshot.getKey()传递到一个侦听器中,以检查数据库的“Users”树。
你应该创建一个精确指向Users/$uid/preferences/Do/$pushedId的新引用,并附加一个监听器。在代码中,它应该看起来像这样:

DatabaseReference db = FirebaseDatabase.getInstance().getReference();
    DatabaseReference doRef = db.child("Activity").child("Do");
    doRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(@NonNull DataSnapshot activitySnapshot, @Nullable String s) {
            if (activitySnapshot.exists()){
                String currentActivityId = activitySnapshot.getKey();

                String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
                DatabaseReference ref = db.child("Users").child(uid).child("preferences").child("Do").child(currentActivityId);
                ref.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<DataSnapshot> task) {
                        if (task.isSuccessful()) {
                            DataSnapshot result = task.getResult();
                            if (result.getValue() != null) {
                                boolean exists = result.getValue(Boolean.class);
                                if (exists) {
                                    Log.d("TAG", "The id exists.");
                                } else {
                                    Log.d("TAG", "The id doesn't exist.");
                                }
                            }}
                        } else {
                            Log.d("TAG", task.getException().getMessage()); //Never ignore potential errors!
                        }
                    }
                });

                //rest of the code
            }
        }

        @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(@NonNull DatabaseError error) {
            Log.d("TAG", error.getMessage()); //Never ignore potential errors!
        }
    });

相关问题