如何从内部匹配值中获取节点密钥

时间:2018-12-09 19:11:41

标签: java android firebase firebase-realtime-database

我需要获取与我之前在另一个表中循环过的用户ID匹配的每个事件的键,因此,我有此表,其中已登录的当前userID具有将有助于以下操作的用户列表:某些事件

enter image description here

我以MUTzo13NuJRlbbkZCDp2nCdHkIn1用户身份登录,然后我获得了该ID以下的所有用户,所以我知道我邀请了哪个人

我已经这样做了

 mDatabase.child("userEvent").child(mAuth.getCurrentUser().getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if(dataSnapshot.exists()){

                    for(DataSnapshot snapshot1 : dataSnapshot.getChildren()){

                        final String users = snapshot1.getKey();

...

所以,现在我的用户字符串中已经有当前登录的所有用户。

现在,由于我拥有所有已登录用户,所以我想循环另一张表,找到匹配的用户并获取密钥(这些用户没有协助的事件ID)

表事件

enter image description here

例如,如果以前循环的用户在其中,则需要获取ID LT9d-sJCmMBUIW14AG8,所以我就尝试了

mDatabase.child("userEvent").child(mAuth.getCurrentUser().getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if(dataSnapshot.exists()){

                    for(DataSnapshot snapshot1 : dataSnapshot.getChildren()){

                        final String user = snapshot1.getKey();

                        //Now I go to the events table and try to get the event ID if those users are inside of them
                        mDatabase.child("events").addListenerForSingleValueEvent(new ValueEventListener() {
                            @Override
                            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                                if(dataSnapshot.exists()){

                                  for(DataSnapshot snapshot2 : dataSnapshot.getChildren()){

                                    if(snapshot2.equals(user))
                                    Log.d(TAG, "onDataChange: "+snapshot2.getKey());

                                }
                                }
                            }

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

                            }
                        });

                    }

                }

            }

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

            }
        });

但是它不起作用,而是getKey返回名称节点事件,而不是用户所属节点的名称。

任何提示?

编辑:

感谢彼得的回答,我遇到了麻烦,那就是用户与他们不属于的事件保持良好的匹配状态

enter image description here

所以,问题在于它与不属于它的事件用户匹配

1 个答案:

答案 0 :(得分:1)

尝试以下操作:

mDatabase.child("events").orderByChild(user).addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
   if(dataSnapshot.exists()){
    for(DataSnapshot snapshot2 : dataSnapshot.getChildren()){
           String keys = snapshot2.getKey();
       }
    }
  }

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

您需要在user内的第一个侦听器中添加检索到的orderByChild()字符串,然后您将获得一个包含该子级的快照。循环后,您将能够获取该孩子的父密钥。