下面是我实现的代码,该代码可以工作,但是当它们应该不同时,它将最后的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) {
}
});
到池列表中的最后一个值!?
答案 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
您可以执行以下数据库,父节点包括Users
,Pools
和Games
。然后,您可以做两个节点,一个叫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
上并检索了poolId
和userNames
,还可以添加其他信息并在此处进行检索。
然后,您使用引用节点valueEventListener
的嵌套gamePool
并使用检索到的键(即poolId
)创建查询,并{{1} },然后检索游戏名称以及您可以在其中添加的其他信息,例如游戏信息...