getChildrenCount()在后台如何工作?

时间:2018-08-15 15:23:50

标签: java android firebase firebase-realtime-database

在我的数据库中,我可以说有5000多名用户,现在如果我在主父节点中使用getChildrenCount()来获得多少人

我知道getChildrenCount会返回一个带有父级内部子级数量的long,但这会如何影响性能?

几个月前,我制作了一个应用程序,与通过Web控制台进行操作相比,它可以更有效地管理用户,因为页面变得静态并且用户不断增长。

现在,我想知道是否每次我请求用户数量时,该应用程序都在遍历5000+个用户,并对每个用户进行计数,所以我在浪费读取资源。

我的问题:

getChildrenCount()是否在某处存储了最近检索到的用户数?
每次我运行我的应用以在每个孩子中用+ =计数时,getChildrenCount()都会执行吗?

我认为,这样做的最佳实践是运行一次getChildrenCount,然后将这些用户存储在一个节点中,让我们说userQuantity = 5000,然后在每次有新用户进入(带有事务)时向该节点添加1 ,因此在我的应用程序管理器中,我只查询一个节点即可获得数量,这比再次遍历所有父节点来获取用户更有效

1 个答案:

答案 0 :(得分:2)

使用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对象投射到Map,则下面的代码行将很好地工作:

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

因此,在getChildrenCount()对象上调用DataSnapshot就像在size()上调用Map方法一样,该方法内部计算其包含的对象数。

  

我在浪费阅读资源

在新的Cloud Firestore数据库中可用,根据您对Firestore数据库执行的CRUD操作数向您收费。如果您有兴趣,可以使用 this 来计算Cloud Firestore中集合下的文档数。如您所见,除了经典的计数操作+=外,我们还有task.getResult().size()。我还提到过,存储计数器的最佳实践是将它们存储在Firebase实时数据库中。因此,我认为,请继续进行此操作并将其分别存储。

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

并回答您的问题:

  

getChildrenCount()是否将我的用户的最新检索数存储在某个地方?每当我运行我的应用以在每个孩子中用+ =进行计数时,getChildrenCount()是否会执行?

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

相关问题