Обнаружение изменения значения с помощью firebase ValueEventListener - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь обнаружить изменение значения в моей базе данных Firebase. Вот мой код для инициализации ValueEventListener:

valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            try {
                String customerLocation = String.valueOf(dataSnapshot.getValue());
                Point customerPoint = locationFounder.getPoint(customerLocation);

                if (customerPoint != null) {
                    databaseReference.child("isActive").addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                            boolean isActive = Boolean.valueOf(String.valueOf(dataSnapshot.getValue()));

                            displayPopUp(isActive, customerPoint, customerLocation);
                        }

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

                        }
                    });
                }
            } catch (Exception e) {
                Log.d("Listener",e.toString());
            }
        }

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

        }
    };
    destinationReference.addValueEventListener(valueEventListener);

Проблема возникает, когда я хочу вызвать этого слушателя в моей деятельности. Я пытался с этим:

destinationListener.getValueEventListener().onDataChange(REQUIRED_SNAPSHOT);

Я не знаю, как я могу получить снимок datasnapshot, который требуется для onDataChange. Я хотел бы получить эту работу с ValueEventListener, а не ChildEventListener, если это возможно. Однако я не совсем уверен, что это правильный способ попытаться обнаружить изменение значения. Если есть какой-то другой способ, который будет работать должным образом, я хотел бы знать об этом.

1 Ответ

0 голосов
/ 11 апреля 2020

В базе данных реального времени Firebase ничего не написано, чтобы указать, какие данные c в снимке изменились в методе onDataChange.

Если вы хотите узнать, какое свойство c указано Если у вас есть изменения, вам необходимо:

  1. Сохранить снимок, полученный в onDataChange, в поле.
  2. Когда вызывается onDataChange, сравните данные в новый снимок с данными в поле.

Скажите, что у вас есть ссылка на узел в вашем JSON, и под этим узлом находится свойство status, и вы хотите, чтобы оба слушали ко всему узлу и определите, изменился ли status.

Вы бы сделали это с помощью чего-то вроде:

// Add a field to your class to keep the latest snapshot
DataSnapshot previousSnapshot;

// Then add your listener
databaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        bool wasActive = false;
        if (previousSnapshot != null && previousSnapshot.child("status").exists()) {
            wasActive = dataSnapshot.child("status").getValue(Boolean.class);
        }
        boolean isActive = dataSnapshot.child("status").getValue(Boolean.class);

        if (isActive <> wasActive) {
            ... the user's status changed
        }

        previousSnapshot = dataSnapshot;
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        throw databaseError.toException(); // never ignore errors
    }
});

...