我有一个firebase数据库架构,就像文档推荐的那样(数据扇出)。我有一个节点与所有“运动员”和另一个节点与“团队”。我想根据“球队”节点内的运动员ID从“运动员”节点中检索运动员的信息。
我的代码如下所示:
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已经完成之后填充我的适配器有点过头了。必须有一种更简单的方法来做到这一点。我问,因为我还需要从另一个节点检索其他数据,这将非常混乱。
如果有人知道更好的方式,请告诉我。谢谢。
答案 0 :(得分:1)
我可以想到几种方法:
$athleteId: "Athlete's name"
。可能有更多选择,但这些是我的典型选择。
哦顺便说一下,key
永远不会是空的,所以不需要这个检查(和缩进级别):if (!TextUtils.isEmpty(key)) {
。