Android 通过多次查找从Firebase检索正确信息时出现问题

Android 通过多次查找从Firebase检索正确信息时出现问题,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,下面是我实现的代码,它可以工作,但它将最后一个Firebase子级“PoolName”和“PoolId”分配给所有三(3)个结果,而这三个结果应该是不同的 playerInPoolReference = mFirebaseDatabase.getReference("PlayerInPool").child(userID); playerInPoolReference.addValueEventListener(new ValueEventListener() { @Over

下面是我实现的代码,它可以工作,但它将最后一个Firebase子级“PoolName”和“PoolId”分配给所有三(3)个结果,而这三个结果应该是不同的

playerInPoolReference = mFirebaseDatabase.getReference("PlayerInPool").child(userID);

playerInPoolReference.addValueEventListener(new ValueEventListener() {

        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            if(dataSnapshot.exists()) {

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

                    String poolID = poolSnapshot.getKey();

                    poolReference = mFirebaseDatabase.getReference("Pools").child(poolID);

                    poolReference.addListenerForSingleValueEvent(new ValueEventListener() {

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

                            if (snapShot.exists()) {

                                pID = snapShot.getKey();

                                String gameID = snapShot.child("GameId").getValue().toString();
                                //
                                pName = snapShot.child("PoolName").getValue().toString();

                                gameReference = mFirebaseDatabase.getReference("Games").child(gameID);

                                gameReference.addListenerForSingleValueEvent(new ValueEventListener() {

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

                                        if (snap.exists()) {

                                            Pools pool = snap.getValue(Pools.class);

                                            pool.setPoolId(pID);
                                            pool.setPoolName(pName);
                                            //
                                            poolList.add(pool);

                                            adapter = new PoolAdapter(getActivity(), poolList);

                                            recyclerView.setAdapter(adapter);

                                        } 

                                    }

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

                                    }

                                });

                            } 

                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }

                    });

                } // End for loop

            }

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }

    });
是否有人知道或者已经实现了一个解决方案,我希望在其中获取特定用户所在的组列表(在我的例子中是池)

在我的例子中,我检查玩家所在的池,然后需要访问池节点以获取池信息,其中包括特定的游戏id,最后获取关联的游戏信息,以便我可以向玩家显示

Firebase结构如下所示:

Users
    userId1
       userName : peter
    userId2
       userName : john

Pools
    poolId1
       poolName: pool1
       etc....

    poolId2
       poolName: pool2

 Games
    1000
       gameName: game1
    1001
       gameName: game2


 PlayerInPool
    UserId
       12345: true
       54321: true
       etc...

    UserId:
       12345: true
问题在于它设置了以下内容:

pool.setPoolId(pID);
pool.setPoolName(pName);
到池列表中的最后一个值

Users
 userId1
     userName : peter
 userId2
     userName : john


Pools
  poolId1
    poolName : pool1
  poolId2
    poolName : pool2

Games
  gameId1
     gameName : game1
  gameId2
      gameName: game2

UserPool
    poolId1
      userName: peter
    poolId2
      userName: john

GamePool
    gameId
      poolId: poolId1
      gameName : game1

您可以执行以下数据库、父节点操作,包括
用户
游戏
。然后您可以执行两个节点,一个称为
UserPool
,可以包含每个池中的所有用户,另一个称为
GamePool
,可以包含游戏名称和池信息

FirebaseDatabase database       = FirebaseDatabase.getInstance();
DatabaseReference userReference = database.getReference("UserPool");
DatabaseReference gameReference = database.getReference("GamePool");

userReference.orderByKey().equalTo(poolId).addValueEventListener(new ValueEventListener() {
 @Override
public void onDataChange(DataSnapshot dataSnapshot) {
  for(DataSnapshot ds: dataSnapshot.getChildren()){
    String keyPool = ds.getKey();
    String userId  = ds.child("userName").getValue().toString();

    gameReference.orderByChild("poolId").equalTo(keyPool).addValueEventListener(new ValueEventListener() {
          @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
          for(DataSnapshot datas : dataSnapshot.getChildren()){
            String gameId   = datas.getKey();
            String gameName = datas.child("gameName").getValue().toString();
       }
     }
          @Override
       public void onCancelled(DatabaseError databaseError) {}
    });

   }
 }
@Override
public void onCancelled(DatabaseError databaseError) {
  }
});
在这里,您将引用放在child
UserPool
并检索
poolId
userNames
,您还可以在此处添加其他信息并检索它们


然后使用嵌套的
valueEventListener
引用节点
gamePool
,并使用检索到的密钥(即
poolId
),创建查询和
orderByChild(“poolId”).equalTo(keyPool)
,然后检索游戏名称,还有其他可以添加的信息,比如游戏信息…

实际上不需要额外的
GamePool
节点。我已经为iOS和firebase做了这些,所以我不想为Android进行重组。我更新了我的Firebase结构供您查看。没有额外的节点可以完成吗?最后,我得到了信息,这样我就可以把它放在回收器视图中。我正在寻找一个可以获取池信息和游戏信息并将其放入一个对象(类)中的方法。
GamePool
节点将使查询和检索池信息和游戏信息变得更容易。。。在检索这些值之后,您可以使用setter方法将这些值添加到对象中