Android 将ds.child(key).setValue()插入子对象时出错

Android 将ds.child(key).setValue()插入子对象时出错,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,如果“月”等于Firebase上的月,我想总结一下键中的“monthamt”。当我运行此代码时,它似乎是: 我已经更新了我的完整代码如下 总结“蒙塔姆特”的代码,我不知道如何将其指向键: final String key = ds.push().getKey(); ds.orderByKey().addListenerForSingleValueEvent(new ValueEventListener() {

如果“月”等于Firebase上的月,我想总结一下键中的“monthamt”。当我运行此代码时,它似乎是:

我已经更新了我的完整代码如下

总结“蒙塔姆特”的代码,我不知道如何将其指向键:

final String key = ds.push().getKey();
                    ds.orderByKey().addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            if (dataSnapshot.exists()) {
                                ds.addChildEventListener(new ChildEventListener() {
                                    @Override
                                    public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                                        Calendar c = Calendar.getInstance();
                                        SimpleDateFormat format = new SimpleDateFormat("ddMMyy");
                                        SimpleDateFormat fm = new SimpleDateFormat("MM");
                                        String month = (String) dataSnapshot.child("month").getValue();
                                        //testing
                                        double value = Double.valueOf(String.valueOf(dataSnapshot.child("amt").getValue()));
                                        double mvalue = Double.valueOf(String.valueOf(dataSnapshot.child("monthamt").getValue()));
                                            value = roundOff(value);
                                            mvalue = roundOff(mvalue);

                                        if (fm.format(c.getTime()).equals(month)) {
                                            String key1 = dataSnapshot.getKey();
                                            ds.child("-MJMXp5Obhsd68HMrWax").child("monthamt").setValue(roundOff(mvalue + amt) + "");
                                                Toast.makeText(newTransaction.this, "ok", Toast.LENGTH_SHORT).show();
                                        } else {
                                            Calendar b = Calendar.getInstance();
                                            ds.child(key).child("date").setValue(format.format(b.getTime()));
                                            ds.child(key).child("amt").setValue(amt + "");
                                            ds.child(key).child("month").setValue(fm.format(b.getTime()));
                                            ds.child(key).child("monthamt").setValue(amt + "");
                                            ds.child(key).child("trans").setValue("1");
                                            dt.child("Bill").child(k).child("gtranid").setValue("1");
                                            Toast.makeText(newTransaction.this,month, Toast.LENGTH_SHORT).show();
                                        }
                                    }

                                    @Override
                                    public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

                                    }

                                    @Override
                                    public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

                                    }

                                    @Override
                                    public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

                                    }

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

                                    }
                                });

                            } else {
                                Calendar c = Calendar.getInstance();
                                SimpleDateFormat format = new SimpleDateFormat("ddMMyy");
                                SimpleDateFormat fm = new SimpleDateFormat("MM");
                                ds.child(key).child("date").setValue(format.format(c.getTime()));
                                ds.child(key).child("amt").setValue(amt + "");
                                ds.child(key).child("month").setValue(fm.format(c.getTime()));
                                ds.child(key).child("monthamt").setValue(amt + "");
                                ds.child(key).child("trans").setValue("1");
                                dt.child("Bill").child(k).child("gtranid").setValue("1");
                            }
                        }

发生这种情况的原因与我在你早些时候告诉你的完全相同。你失踪了一个孩子。使用以下代码行时:

ds.child("monthamt").setValue(roundOff(mvalue + amt) + "");
该值直接添加到
摘要
下。为了能够更改/添加值,您应该在引用中添加该键:

ds.child("-MJMXp5Obhsd68HMrWax").child("monthamt").setValue(roundOff(mvalue + amt) + "");

现在,
monthamt
属性的新值将写入正确的节点下。

好的,在“10”月份有效。但它会为“11”的新月份推送一个随机的新键,然后将该键存储到一个变量中,并在需要时使用它。这可以帮助您实现这一目标。再查一下弗兰克·范·帕夫伦的。请尝试一下,告诉我它是否有效。也请提供一些反馈,以获得我的答案。我创建了另一个“key1”并存储dataSnapshot.getKey()。当我匹配“月”值时,它就工作了。但它将在同一个月向Firebase推出另一把新钥匙。字符串key1=dataSnapshot.getKey();ds.child(key1.child(“monthamt”).setValue(四舍五入(mvalue+amt)+”);不,不,不。你应该只推一次。你拿到钥匙,在你的参考资料中使用它,就这样。但是请注意,当您设置值时,这是有效的。读取值时,应使用查询。