0
我有一个像文档推荐(数据扇出)一样设置的Firebase数据库架构。我有一个节点与所有“运动员”和另一个节点与“队”。我想根据“队”节点内的运动员ID从“运动员”节点检索运动员的信息。Android Firebase数据库使用多个侦听器检索值
我的代码如下所示:
if (eventListener == null) {
eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
mAdapter.clear();
athleteCount = 0;
final List<Athlete> athletes = new ArrayList<>();
final long childrenCount = dataSnapshot.getChildrenCount();
if (childrenCount == 0) {
hideProgressBar();
}
for (DataSnapshot ds : dataSnapshot.getChildren()) {
String key = ds.getKey();
athleteCount++;
if (!TextUtils.isEmpty(key)) {
mDatabaseReference.child(Athlete.ATHLETE).child(key)
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Athlete athlete = dataSnapshot.getValue(Athlete.class);
if (athlete != null) {
athletes.add(athlete);
if (athleteCount == childrenCount) {
Collections.sort(athletes, new Athlete.AthleteComparator());
mAdapter.setRoster(athletes);
hideProgressBar();
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
};
mDatabaseReference.child("teams")
.child("-KnyqjH0acSol5cxHLM1")
.child("athletes")
.addValueEventListener(mValueEventListener);
现在这个代码不正常工作,但我不认为这是一个有点洁癖继续增加监听器,然后跟踪该singleValueListeners后填充我的适配器已完成。必须有一个更简单的方法来做到这一点。我在问,因为我还需要从另一个节点检索其他数据,这会非常混乱。
如果有人知道更好的方法,请让我知道。谢谢。
我会尝试第一种方法。第二种方法听起来也是一个好主意。由于我需要查看运动员,因此我必须在整个应用程序中保留运动员的记忆。我确实有重复的数据,但如果有人编辑了运动员的名字,找到同样的运动员让我们说7支球队,然后在那里编辑运动员的名字会很痛苦。谢谢。 – TrackDave
如果您复制数据,则在写入处理时会出现代码复杂性和性能方面的问题。如果使用客户端连接(正如您一直在尝试的那样),则在读取处理中会出现代码复杂性和性能方面的问题。如果读取比写入更频繁,我会为此进行优化。 –