Firebasedatabase - 如何计算子节点

Posted

技术标签:

【中文标题】Firebasedatabase - 如何计算子节点【英文标题】:Firebasedatabase - how to count child node 【发布时间】:2017-10-04 11:14:34 【问题描述】:

我使用 Firebase 作为数据库。我想知道如何计算父亲的孩子。我想做的是,如果没有孩子,我想显示文本视图,但如果父亲下面有孩子,我想显示所有孩子的循环视图。 每个组保存在用户 ID 下。在用户 ID 下保存了用户打开的所有组。 我已经尝试了几件事,但仍然没有弄清楚如何做到这一点。 请看图片链接,希望你能理解。

编辑:

计数儿童的代码

  refCountMembers.getReference(Params.GROUP_LISTS).child(currentUser.getUid()).addChildEventListener(new ChildEventListener() 
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) 
            for(DataSnapshot snapshot : dataSnapshot.getChildren())
                long count = snapshot.getChildrenCount(); 
                if(snapshot.getChildrenCount() == 0) 
                    +"");                 
                    tvEmptyListGroup.setVisibility(View.VISIBLE);
                    break;
                else
                    progressBar.setVisibility(View.INVISIBLE);
                    tvEmptyListGroup.setVisibility(View.INVISIBLE);
                    ref = FirebaseDatabase.getInstance().getReference(Params.GROUP_LISTS).child(currentUser.getUid());
                    GroupsAdapter adapter = new GroupsAdapter(ref,getParentFragment(),progressBar);
                    rvGroup.setAdapter(adapter);
                    rvGroup.setLayoutManager(new LinearLayoutManager(getContext()));
     
   
  

我是用 childEventListener 做的,因为我想确保当我删除一个组并且有 0 个组时,它会显示 textview,或者如果我要添加一个组,它应该显示 recyclerView。 childEventListener 每次更改它的父级时都会启动,对吗?

【问题讨论】:

解决方案可能涉及DataSnapshot.getChildrenCount()。如果没有看到获取父节点的代码,很难提供帮助。 我添加了我的代码。好吃吗? 要检测是否没有孩子,您需要保留自己的计数器(在onChildAdded 中递增,在onChildRemoved 中递减),或者您需要额外的ValueEventListener地点。在后一种情况下,您可以使用snapshot.getChildrenCount() == 0!snapshot.exists() 来检测是否存在子节点。也可以在这里查看我的答案:***.com/questions/39900082/…(适用于 javascript,但 android SDK 的工作方式相同)。 谢谢,真的很有帮助! 【参考方案1】:

创建一个模型类作为您的组信息。

public class Group 
    private String groupName;
    private String groupUID;
    private String ownerGroupUID;

    // Getters and setters

现在获取保存在用户 ID 下的所有组。

    final List<Group> groupList = new ArrayList<>(); // list of groups
    FirebaseDatabase.getInstance()
            .getReference()
            .child("GroupLists")
            .child("dS...") // this is the id of user - over whose groups you want to iterate
            .addListenerForSingleValueEvent(new ValueEventListener() 
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) 

                    for (DataSnapshot snapshot : dataSnapshot.getChildren())
                        Group group = snapshot.getValue(Group.class); // this is a group
                        groupList.add(group); // add to list
                    

                    if (groupList.size()>0)
                        // Now display all groups in recycler view..

                     else 
                        // Now display in textview that group list is empty

                    
                

                @Override
                public void onCancelled(DatabaseError databaseError) 

                
            );


【讨论】:

以上是关于Firebasedatabase - 如何计算子节点的主要内容,如果未能解决你的问题,请参考以下文章

如何计算子字符串的出现次数? [复制]

Swift 4和Firebase如何计算子值

计算子查询中的行数

如何根据时间戳值计算子列表的平均值?

Postgres:计算子查询中的唯一数组条目

SQL连接表的最大数量限制是适用于整个查询,还是单独计算子查询?