我坚持要从Firebase获取数据,然后在进行一些更改后将其推回。
下面给出的代码可以解决问题,因为我需要获取int并将其值和另一个值的和推送一次到Realtime Database,但是它多次推送了它,最后一次超过39K行,除了1
private DatabaseReference ratingReference = FirebaseDatabase.getInstance().getReference().child(Consts.RATING_DB);
public void setRating(String uid, int addPoint) {
ratingReference.child(uid).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
int rating = 0;
if (dataSnapshot.child(Consts.RATING).getValue() != null) {
rating = Integer.valueOf(dataSnapshot.child(Consts.RATING).getValue().toString());
}
DatabaseReference ref = ratingReference.child(getUid()).push();
Map<String, Object> ratingMap = new HashMap<>();
ratingMap.put("rating", rating + addPoint);
ref.updateChildren(ratingMap);
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
}
如果您能帮助我,我将非常感激。
答案 0 :(得分:1)
假设Consts.RATING
持有与rating
类似的字符串值,并且此属性的类型为数字而不是字符串,要将addPoint
的值添加到现有rating
的值中,请使用以下代码行:
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
long rating = 0;
if(dataSnapshot.child(Consts.RATING).exists()) {
rating = dataSnapshot.child(Consts.RATING).getValue(Long.class);
long newValue = rating + addPoint;
dataSnapshot.child(Consts.RATING).getRef().setValue(newValue);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage());
}
};
ratingReference.child(uid).addListenerForSingleValueEvent(valueEventListener);
如您所见,不需要使用任何push()
调用。