首页 > 解决方案 > 如何在firebase数据库中添加来自不同根节点的子节点的总和

问题描述

我尝试了很多方法来从所有孩子那里得到所有金额的总和,但没有工作。

这是该特定任务的全部主要活动:

public class hostelincome extends AppCompatActivity {

   EditText name,amount,status,mod,seriesnumber;;
   Button storedata;
   TextView prevnumber;
   FirebaseDatabase firebaseDatabase;
   DatabaseReference reference,reference1;
String name1,amount1,status1,mod1,date,count1,count2,incometotal1;
double amount2,incometotal;
int total;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_hostelincome);

    name = (EditText)findViewById(R.id.name);
    amount = (EditText)findViewById(R.id.amount);
    status = (EditText)findViewById(R.id.status);
    final String currentDateTimeString = DateFormat.getDateTimeInstance().format(new Date());
    mod = (EditText)findViewById(R.id.mod);
    storedata = (Button)findViewById(R.id.storedata);
    firebaseDatabase = FirebaseDatabase.getInstance();
    date = getIntent().getStringExtra("date");

    reference = 
    firebaseDatabase.getReference("Hostel").child(date).child("Income").child(currentDateTimeString 
    );



    storedata.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            name1 = name.getText().toString();
            amount1 = amount.getText().toString();
            status1 = status.getText().toString();
            mod1 = mod.getText().toString();



            reference.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                   total = 0;

                    for(DataSnapshot ds : dataSnapshot.getChildren()) {
                        String amount = ds.child("amount").getValue(String.class);
                        int value = Integer.valueOf(amount);
                        total =+ value;
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            });

            count1 = Integer.toString(total);

            Toast.makeText(getApplicationContext(),count1,Toast.LENGTH_LONG).show();


            if (amount1.isEmpty()){}
            else{
            amount2 = Double.parseDouble(amount1);}

            incomeinfo incomeinfo;
            incomeinfo = new incomeinfo(name1,amount1,status1,mod1);
            reference.setValue(incomeinfo);
        }
      });

     }
   }

日期被视为一个字符串,将日/月/年的整数值加在一起。

当我运行这个程序时,我收到一个错误来添加以下值:

  Process: org.electromob.budget, PID: 21949
  java.lang.NumberFormatException: s == null
    at java.lang.Integer.parseInt(Integer.java:570)
    at java.lang.Integer.valueOf(Integer.java:794)
    at org.electromob.budget.hostelincome$1$1.onDataChange(hostelincome.java:71)
    at 
  com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase- 
  database@@19.2.0:75)
    at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase- 
  database@@19.2.0:63)
    at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase- 
  database@@19.2.0:55)
    at android.os.Handler.handleCallback(Handler.java:790)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:7000)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:441)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)'''

我的火力基地信息上课

    public class incomeinfo {

    public String payeename;
    public String amount;
    public String status;
    public String mod;

    public incomeinfo() {
    }


    public incomeinfo(String payeename, String amount, String status, String mod) {
    this.payeename = payeename;
    this.amount = amount;
    this.status = status;
    this.mod = mod;
    }

    public String getPayeename() {
    return payeename;
    }

    public void setPayeename(String payeename) {
    this.payeename = payeename;
    }

    public String getAmount() {
    return amount;
    }

    public void setAmount(String amount) {
    this.amount = amount;
    }

    public String getStatus() {
    return status;
    }

    public void setStatus(String status) {
    this.status = status;
    }

    public String getMod() {
    return mod;
    }

    public void setMod(String mod) {
    this.mod = mod;
    }

    }

Firebase 结构添加到我的项目下方:

Firebase存储结构图片点击链接

有人可以帮我解决我的错误吗?

标签: androidfirebasefirebase-realtime-database

解决方案


看起来您在 JSON 中阅读的级别太低了。您onDataChange迭代了个人amount、和属性mod,然后它们就不再有孩子了。payeenamestatusamount

如果确实是这种情况,您可以通过将侦听器附加上一层来解决它:

reference = firebaseDatabase.getReference("Hostel").child(date).child("Income");

推荐阅读