亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 192 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號