在通过多次查询从Firebase检索正确的信息时出现问题

时间:2019-03-30 15:38:17

标签: android firebase firebase-realtime-database

下面是我实现的代码,该代码可以工作,但是当它们应该不同时,它将最后的Firebase子对象“ PoolName”和“ PoolId”分配给所有三(3)个结果!?

echo

有人知道或已经实施了一个解决方案,以使我希望获得特定用户所在的组(例如我的池)列表吗?

在我的情况下,我检查玩家所在的池,然后需要访问池节点以获取池信息,其中包括特定的游戏ID,然后最后获取关联的游戏信息,以便我可以显示给玩家。

Firebase的结构如下:

/bin/echo

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

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

        }

    });

到池列表中的最后一个值!?

1 个答案:

答案 0 :(得分:0)

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

您可以执行以下数据库,父节点包括UsersPoolsGames。然后,您可以做两个节点,一个叫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) {
  }
});

这里您将引用放在子项UserPool上并检索了poolIduserNames,还可以添加其他信息并在此处进行检索。

然后,您使用引用节点valueEventListener的嵌套gamePool并使用检索到的键(即poolId)创建查询,并{{1} },然后检索游戏名称以及您可以在其中添加的其他信息,例如游戏信息...