代码之家  ›  专栏  ›  技术社区  ›  Gastón Saillén Michael Lehenbauer

getChildrenCount()在后台如何工作?

  •  1
  • Gastón Saillén Michael Lehenbauer  · 技术社区  · 6 年前

    在我的数据库中,我有超过5000个用户,如果我使用 getChildrenCount() 在主父节点中获取我有多少人

    我知道getChildrenCount返回一个long,其中包含父级中的子级数量,但是,这如何影响性能?

    现在,我想知道,如果每次我请求用户数量的应用程序是通过5000多个用户循环,并计算每一个,所以我浪费了阅读资源。

    在某处存储最新检索到的我的用户数?
    getChildrenCount() 每次我运行我的应用程序时执行,以在每个子项中使用“+”计数?

    我认为这样做的最佳实践是运行getChildrenCount一次,然后将这些用户存储在一个节点中 userQuantity = 5000

    1 回复  |  直到 6 年前
        1
  •  2
  •   Alex Mamo    6 年前

    当你使用数据快照时 getChildrenCount() 方法,这并不意味着你在整个 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 也可以称为 地图

    DataSnapshot实例包含来自Firebase数据库位置的数据。任何时候读取数据库数据时,都会将数据作为数据快照接收。

    所以如果你想 反对 地图 ,下面的代码行将工作得非常好:

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

    如此呼唤 在一个 数据快照 对象就像调用 size() 方法

    我在浪费阅读资源

    对于新的云Firestore数据库,这是可用的,其中根据对Firestore数据库执行的CRUD操作的数量对您收费。如果你感兴趣, this 是如何计算Cloud Firestore中集合下的文档数的。如你所见,除了经典的伯爵歌剧 += task.getResult().size() . 我还提到了存储计数器的最佳实践是将它们存储在Firebase实时数据库中。所以在我看来,你可以把它们分开存放。

    如果你认为你的应用会发展得很快,另一种方法是使用 Cloud Functions 每次从中添加或删除用户时更新用户计数器 节点。这个技术对大数据集非常有效。

    回答你的问题:

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

    getChildrenCount() 将调用方法以获取最新的用户数。如果你想实时得到那个号码,那么你应该在 参考资料。