如何从Firebase获取数据然后将其推回

时间:2018-10-30 16:44:16

标签: android firebase firebase-realtime-database

我坚持要从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) {}
        });
    }

如果您能帮助我,我将非常感激。

1 个答案:

答案 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()调用。