Java 如何获取Firebase中所有可用子项的总子项数?
我的Firebase实时数据库结构是:Java 如何获取Firebase中所有可用子项的总子项数?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我的Firebase实时数据库结构是: { "Declare":{ "GokulAsGokul1":{ "10-2020":{"Month":"10-2020"}, "5-2021":{"Month":"5-2021"}, "5-2023":{"Month":&qu
{
"Declare":{
"GokulAsGokul1":{
"10-2020":{"Month":"10-2020"},
"5-2021":{"Month":"5-2021"},
"5-2023":{"Month":"5-2023"},
"5-2026":{"Month":"5-2026"},
"5-2027":{"Month":"5-2027"}
},
"GokulAsGokul2":{
"10-2025":{"Month":"10-2025"},
"5-2021":{"Month":"5-2021"}
},
"GokulAsGokul3":{
"6-2021":{"Month":"6-2021"}
},
"GokulAsGokul4":{
"4-2021":{ "Month":"4-2021"}
}
}
}
每个用户都有一些数据集,比如GokulAsGokul1有5组,GokulAsGokul2有2组。我需要所有用户的数据集计数。它将是5+2+1+1=9。但我得到的结果只有4分
我的代码是:
reference = FirebaseDatabase.getInstance().getReference("Declare");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
String name = Long.toString(snapshot.getChildrenCount());
Toast.makeText(DashboardActivity.this, name, Toast.LENGTH_SHORT).show();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Toast.makeText(DashboardActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show();
}
});
要解决这个问题,您应该通过在“DataSnapshot”对象上循环两次,使数据库更深一层。因此,下面几行代码就可以做到这一点:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference declareRef = rootRef.child("Declare");
declareRef.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
@Override
public void onComplete(@NonNull Task<DataSnapshot> task) {
if (task.isSuccessful()) {
int count = 0;
for (DataSnapshot nameSnapshot : task.getResult().getChildren()) {
for (DataSnapshot dateSnapshot : nameSnapshot.getChildren()) {
count++;
}
}
Log.d(TAG, "count: " + count);
} else {
Log.d(TAG, task.getException().getMessage()); //Don't ignore potential errors!
}
}
});
使用您的代码,您只得到4,因为您在“Declare”节点的子节点上在线循环,这些子节点是4。GokulAsGokul1、GokulAsGokul2、GokulAsGokul3和GokulAsGokul4。运行良好,Alex
count: 9