Android 通过多次查找从Firebase检索正确信息时出现问题
下面是我实现的代码,它可以工作,但它将最后一个Firebase子级“PoolName”和“PoolId”分配给所有三(3)个结果,而这三个结果应该是不同的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
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) {
}
});
在这里,您将引用放在childUserPool
并检索poolId
和userNames
,您还可以在此处添加其他信息并检索它们
然后使用嵌套的
valueEventListener
引用节点gamePool
,并使用检索到的密钥(即poolId
),创建查询和orderByChild(“poolId”).equalTo(keyPool)
,然后检索游戏名称,还有其他可以添加的信息,比如游戏信息…实际上不需要额外的GamePool
节点。我已经为iOS和firebase做了这些,所以我不想为Android进行重组。我更新了我的Firebase结构供您查看。没有额外的节点可以完成吗?最后,我得到了信息,这样我就可以把它放在回收器视图中。我正在寻找一个可以获取池信息和游戏信息并将其放入一个对象(类)中的方法。GamePool
节点将使查询和检索池信息和游戏信息变得更容易。。。在检索这些值之后,您可以使用setter方法将这些值添加到对象中