java - 如何从内部匹配值获取节点键

标签 java android firebase firebase-realtime-database

我需要获取与我之前在另一个表中循环的用户 ID 相匹配的每个事件的键,因此,我有这个表,其中当前登录的用户 ID 有一个用户列表,这些用户将有助于特定事件

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();

...

所以,现在我的用户字符串包含了当前登录的所有用户。

现在,由于我拥有属于已登录用户的所有用户,因此我想循环另一个表,找到匹配的用户并获取 key (这些用户未协助的事件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返回的是名称节点事件,而不是用户所属节点的名称。

有什么建议吗?

编辑:

感谢 Peter 的回答,我遇到了一个问题,即用户与他们不属于的事件相匹配

enter image description here

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

最佳答案

尝试以下操作:

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) {
  }
});

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

关于java - 如何从内部匹配值获取节点键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53695742/

相关文章:

java - 我们应该在 Web 应用程序注销时将 session 变量重置为 null 吗?

java - 如何有效改变WebDriver对象的浏览器名称?

android - FCM如何在另一个 Activity 中显示来自通知点击的数据

angular - 如何使用 Angular 日期管道转换 firebase 时间戳

java - 发送邮件时出错 - ConnectException

java - Android - 从数组动态更改 ImageView

java - 如何将 EditText 默认为整数但允许小数输入?

android - Android 上的签名板速度很慢

java - Android 中的 SSH 和隧道

firebase - 完成您的请求 Firebase 时出错