首页 > 解决方案 > 我想要在firebase中保存在键值“pqty”中的生产数量的累积?

问题描述

我想在关键“pqty”属性中累积生产数量:

 DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
 DatabaseReference valuesRef = rootRef.child("alldata").child("pqty");
 ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    int sum = o;
    for(DataSnapshot ds : dataSnapshot.getChildren()) {
        int value = ds.getValue(Integer.class);
        sum = sum + value;

    }
    textview15.setText(String.valueOf(sum));
}

@Override
public void onCancelled(DatabaseError databaseError) {}
};

    valuesRef.addListenerForSingleValueEvent(eventListener);

我试过了,输出为 0。但我希望输出为 750。

我正在使用素描工具。

在此处输入图像描述

标签: javaandroidfirebasefirebase-realtime-database

解决方案


首先,您将“pqty”属性作为字符串而不是数字存储在数据库中,我认为这是一个非常糟糕的主意。如果您的数据类型是数字,那么您应该这样存储它。现在,要获得所需的总和,请使用以下代码行:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference alldataRef = rootRef.child("alldata");
alldataRef.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DataSnapshot> task) {
        if (task.isSuccessful()) {
            int sum = 0;
            for (DataSnapshot ds : task.getResult().getChildren()) {
                String pqty = ds.child("pqty").getValue(String.class);
                sum += Integer.parseInt(pqty);
            }
            Log.d("TAG", "sum= " + sum);
            textview15.setText(String.valueOf(sum));
        } else {
            Log.d(TAG, task.getException().getMessage()); //Don't ignore potential errors!
        }
    }
});

根据您的屏幕截图,您的 logcat 中的结果将是:

sum= 750

注意事项:

  • 在您的“valuesRef”引用中不需要任何“.child("pqty")”调用,因为您需要使用对“.getChildren()”方法的调用循环通过“DataSnapshot”对象,然后获取值“pqty”属性。
  • 为了能够对这些值求和,您需要使用Integer.parseInt(String s)方法将该 String 对象解析为一个数字。
  • 您无法使用“.getValue(Integer.class)”从数据库中获取字符串值,因为它总是会产生异常。您需要获取它,因为它实际上是存储的。

推荐阅读