Как получить данные из Firebase, а затем отправить их обратно - PullRequest
0 голосов
/ 30 октября 2018

Я застрял с получением данных из firebase и затем вернул их обратно после некоторых изменений.

Код, приведенный ниже, работает с проблемами, потому что мне нужно получить int и передать сумму его и другого значения в базу данных реального времени один раз, но он выдвинет ее несколько раз, после того, как в прошлый раз это было больше 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 голосов
/ 31 октября 2018

Предполагая, что Consts.RATING содержит строковое значение, аналогичное rating, и типом этого свойства является число и , а не a String, для добавления значения 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() вызов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...