1 回答

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參考上附加一個偵聽器。
添加回答
舉報