Android 将ds.child(key).setValue()插入子对象时出错
如果“月”等于Firebase上的月,我想总结一下键中的“monthamt”。当我运行此代码时,它似乎是: 我已经更新了我的完整代码如下 总结“蒙塔姆特”的代码,我不知道如何将其指向键: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() {
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)+”);不,不,不。你应该只推一次。你拿到钥匙,在你的参考资料中使用它,就这样。但是请注意,当您设置值时,这是有效的。读取值时,应使用查询。