为了账号安全,请及时绑定邮箱和手机立即绑定

getChildrenCount() 如何在后台工作?

getChildrenCount() 如何在后台工作?

catspeake 2021-07-20 17:14:38
在我的数据库中,我可以说超过 5000 个用户,现在如果我getChildrenCount()在主父节点中使用我有多少人我知道 getChildrenCount 返回一个包含父级内子级数量的 long ,但是,这如何影响性能?几个月前,我制作了一个应用程序来管理用户,比从 Web 控制台更有效地管理用户,因为页面变得静态并且用户在增长。现在,我想知道是否每次我请求用户数量时,应用程序都会遍历 5000 多个用户并为每个用户计数,所以我在浪费阅读资源。我的问题:是否getChildrenCount()将最新检索到的用户数量存储在某处?每次我运行我的应用程序以计算每个孩子的 += 时是否getChildrenCount()执行?我认为这样做的最佳实践是运行 getChildrenCount 一次,然后将这些用户存储在一个节点中userQuantity = 5000,然后每次有新用户进入(带有交易)时向该节点添加 1,所以在我的应用程序管理器中,我只是查询单个节点获取数量,比再次遍历所有父节点获取用户更有效
查看完整描述

1 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

当您使用 DataSnapshot 的getChildrenCount()方法时,并不意味着您正在遍历整个DataSnapshot对象。相反,如果您正在使用 DataSnapshot 的getChildren()方法,那么您正是在这样做。让我们举个例子,假设您有一个名为的节点users,如您所说,拥有超过 5000 个用户。


DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();

DatabaseReference usersRef = rootRef.child("users");

ValueEventListener valueEventListener = new ValueEventListener() {

    @Override

    public void onDataChange(DataSnapshot dataSnapshot) {

        long numberOfUsers = dataSnapshot.getChildrenCount(); // Count the number of users


        //This is called iteration

        for(DataSnapshot ds : dataSnapshot.getChildren()) {

            // Get user object on every iteration

        }

    }


    @Override

    public void onCancelled(@NonNull DatabaseError databaseError) {}

};

usersRef.addListenerForSingleValueEvent(valueEventListener);

由于 Firebase 数据库中的每个节点都是Map,因此DataSnapshot也可以称为Map。


DataSnapshot 实例包含来自 Firebase 数据库位置的数据。任何时候读取数据库数据时,都会以 DataSnapshot 的形式接收数据。


因此,如果您想将DataSnapshot对象强制转换为 a Map,则以下代码行将完全正常工作:


Map<String, Object> map = (Map<String, Object>) dataSnapshot;

所以调用getChildrenCount()一个DataSnapshot对象就像调用 a 的size()方法Map,它在内部计算它包含的对象的数量。


我在浪费阅读资源


这适用于新的 Cloud Firestore 数据库,根据您对 Firestore 数据库执行的 CRUD 操作数向您收费。如果您有兴趣,您可以通过这种方式计算 Cloud Firestore 中某个集合下的文档数量。如您所见,除了经典的计数操作之外+=,我们还有task.getResult().size(). 我还提到存储计数器的最佳做法是将它们存储在 Firebase 实时数据库中。所以在我看来,继续这样做并将它们分开存储。


如果您认为您的应用程序会增长得非常快,另一种方法是在每次从节点添加或删除用户时使用Cloud Functions更新用户计数器users。这种技术非常适用于大型数据集。


并回答您的问题:


getChildrenCount() 是否将最新检索到的用户数量存储在某处?每次我运行我的应用程序以计算每个孩子的 += 时,getChildrenCount() 是否执行?


如果您认为最新检索到的号码以某种方式存储在磁盘/内存中,则不会。每次打开应用程序时,getChildrenCount()都会调用方法来获取最新的用户数。如果您想实时获得该数字,那么您应该在users参考上附加一个侦听器。


查看完整回答
反对 回复 2021-07-23
  • 1 回答
  • 0 关注
  • 170 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信