1 回答

TA貢獻1783條經(jīng)驗 獲得超4個贊
當您使用 DataSnapshot 的getChildrenCount()方法時,并不意味著您正在遍歷整個DataSnapshot對象。相反,如果您正在使用 DataSnapshot 的getChildren()方法,那么您正是在這樣做。讓我們舉個例子,假設(shè)您有一個名為的節(jié)點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 數(shù)據(jù)庫中的每個節(jié)點都是Map,因此DataSnapshot也可以稱為Map。
DataSnapshot 實例包含來自 Firebase 數(shù)據(jù)庫位置的數(shù)據(jù)。任何時候讀取數(shù)據(jù)庫數(shù)據(jù)時,都會以 DataSnapshot 的形式接收數(shù)據(jù)。
因此,如果您想將DataSnapshot對象強制轉(zhuǎn)換為 a Map,則以下代碼行將完全正常工作:
Map<String, Object> map = (Map<String, Object>) dataSnapshot;
所以調(diào)用getChildrenCount()一個DataSnapshot對象就像調(diào)用 a 的size()方法Map,它在內(nèi)部計算它包含的對象的數(shù)量。
我在浪費閱讀資源
這適用于新的 Cloud Firestore 數(shù)據(jù)庫,根據(jù)您對 Firestore 數(shù)據(jù)庫執(zhí)行的 CRUD 操作數(shù)向您收費。如果您有興趣,您可以通過這種方式計算 Cloud Firestore 中某個集合下的文檔數(shù)量。如您所見,除了經(jīng)典的計數(shù)操作之外+=,我們還有task.getResult().size(). 我還提到存儲計數(shù)器的最佳做法是將它們存儲在 Firebase 實時數(shù)據(jù)庫中。所以在我看來,繼續(xù)這樣做并將它們分開存儲。
如果您認為您的應(yīng)用程序會增長得非??欤硪环N方法是在每次從節(jié)點添加或刪除用戶時使用Cloud Functions更新用戶計數(shù)器users。這種技術(shù)非常適用于大型數(shù)據(jù)集。
并回答您的問題:
getChildrenCount() 是否將最新檢索到的用戶數(shù)量存儲在某處?每次我運行我的應(yīng)用程序以計算每個孩子的 += 時,getChildrenCount() 是否執(zhí)行?
如果您認為最新檢索到的號碼以某種方式存儲在磁盤/內(nèi)存中,則不會。每次打開應(yīng)用程序時,getChildrenCount()都會調(diào)用方法來獲取最新的用戶數(shù)。如果您想實時獲得該數(shù)字,那么您應(yīng)該在users參考上附加一個偵聽器。
添加回答
舉報