Android Firebase数据库使用多个侦听器检索值

时间:2017-07-20 00:51:09

标签: android firebase firebase-realtime-database

我有一个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已经完成之后填充我的适配器有点过头了。必须有一种更简单的方法来做到这一点。我问,因为我还需要从另一个节点检索其他数据,这将非常混乱。

如果有人知道更好的方式,请告诉我。谢谢。

这是我的架构图片: Firebase Database

1 个答案:

答案 0 :(得分:1)

我可以想到几种方法:

  1. 将获取运动员的代码提取到辅助方法中,或者使用自己的回调,或者通过传递适配器(或视图)。
  2. 预先加载所有运动员,然后直接查找。
  3. 在团队节点下复制您需要的每位运动员的数据。通常这只是他们的名字,所以你有$athleteId: "Athlete's name"
  4. 可能有更多选择,但这些是我的典型选择。

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