Firebase数据库检索多个子项的总和

时间:2018-07-30 17:25:36

标签: java android firebase firebase-realtime-database

我想对Firebase实时数据库中的多个子节点进行求和

enter image description here

这是我的数据库,在这里我要对“金额” 子项求和,那么该怎么做?

请帮助!

2 个答案:

答案 0 :(得分:1)

正如我在您的数据库中看到的那样,您的amount属性的类型为String而不是number。因此,您不能简单地创建String文字的总和。要解决此问题,您需要将属性名称更改为number类型。我还看到您正在将货币和数字一起存储。您应该以编程方式在用户端而不是在数据库中添加货币。如果您考虑更改amount属性的类型,请从此 post

查看我的答案

但是,如果要保留实际的数据库结构,则可以使用以下技巧对所有金额求和:

ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        int total = 0;
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String amount = ds.child("amount").getValue(String.class);
            int value = Integer.valueOf(amount.replace(" Rs.", ""));
            total =+ value;
        }
        Log.d("TAG", String.valueOf(total) + " Rs.");
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
your_database_reference.addListenerForSingleValueEvent(eventListener);

您的logcat中的输出将是:

27000

答案 1 :(得分:0)

您可以为此使用firebase的addValueEventListener方法,并循环dataSnapshot以计算每个子项的总数

your_database_reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    int totalamount = 0;
    for (DataSnapshot snapshot: dataSnapshot.getChildren()) {
        // TODO: handle the dataSnapshot
        String amount = snapshot.child("amount").getValue();
        // remove _Rs. from amount and typecase it to int
        totalAmount += amount;
    }
}

@Override
public void onCancelled(DatabaseError databaseError) {
    // Getting Post failed, log a message
    Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
    // ...
}
});