2017-07-20 63 views
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后填充我的适配器已完成。必须有一个更简单的方法来做到这一点。我在问,因为我还需要从另一个节点检索其他数据,这会非常混乱。

如果有人知道更好的方法,请让我知道。谢谢。

这里是我的架构的图像: Firebase Database

回答

1

我能想到的几种方法:

  1. 。提取得到运动员进入一个辅助方法,无论是与自己的回调的代码,或通过传递适配器(或视图)。
  2. 预载所有运动员,然后直接进行查找。
  3. 复制您在团队节点下立即需要的每个运动员的数据。通常这只是他们的名字,所以你会有$athleteId: "Athlete's name"

可能有更多的选择,但这些都是我的典型做法。

哦顺便说一句,key永远不会是空的,所以这个检查(和缩进级别)是不需要的:if (!TextUtils.isEmpty(key)) {

+0

我会尝试第一种方法。第二种方法听起来也是一个好主意。由于我需要查看运动员,因此我必须在整个应用程序中保留运动员的记忆。我确实有重复的数据,但如果有人编辑了运动员的名字,找到同样的运动员让我们说7支球队,然后在那里编辑运动员的名字会很痛苦。谢谢。 – TrackDave

+0

如果您复制数据,则在写入处理时会出现代码复杂性和性能方面的问题。如果使用客户端连接(正如您一直在尝试的那样),则在读取处理中会出现代码复杂性和性能方面的问题。如果读取比写入更频繁,我会为此进行优化。 –

相关问题