Подтвердить что ты не робот

Firebase child_added получает только добавление ребенка

Из API Firebase:

Child Added: Это событие будет запускаться один раз для каждого исходного ребенка в этом месте, и он будет запускаться снова каждый раз, когда новый добавлен ребенок.

Некоторые коды:

listRef.on('child_added', function(childSnapshot, prevChildName) {
    // do something with the child
});

Но так как функция вызывается один раз для каждого ребенка в этом месте, есть ли способ получить только тот, который был добавлен на самом деле?

4b9b3361

Ответ 1

Чтобы отслеживать все, добавленные после некоторой контрольной точки, не получая предыдущие записи, вы можете использовать endAt() и limit() для захвата последней записи:

// retrieve the last record from `ref`
ref.endAt().limit(1).on('child_added', function(snapshot) {

   // all records after the last continue to invoke this function
   console.log(snapshot.name(), snapshot.val());

});

Ответ 2

limit() метод устарел. limitToLast() и limitToFirst() заменяют его.

// retrieve the last record from `ref`
ref.limitToLast(1).on('child_added', function(snapshot) {

   // all records after the last continue to invoke this function
   console.log(snapshot.name(), snapshot.val());
   // get the last inserted key
   console.log(snapshot.key());

});

Ответ 3

Для меня логика заключалась в том, чтобы иметь значение - например, "статус", который должен быть проверен, прежде чем принимать решение о том, действительно ли он является новым или был старой записью, тогда я установил "статус" на другое значение, поэтому я В следующий раз:

@Override
        public void onChildAdded(DataSnapshot dataSnapshot, String previousChildKey) {

                if(dataSnapshot.hasChildren()) {

                    String Id = (String) dataSnapshot.child("user_id").getValue();
                    String status = (String) dataSnapshot.child("status").getValue();

                    if (Id != null && Id.equals(storedId) && status != null && status.equals("created")) {
                        Log.d("INCOMING_REQUEST", "This is for you!");
                        sessionsRef.child(dataSnapshot.getKey()).child("status").setValue("received");
                    }

                }


        }

Ответ 4

Решение Swift3:

Вы можете получить свои предыдущие данные с помощью следующего кода:

    queryRef?.observeSingleEvent(of: .value, with: { (snapshot) in
        //Your code

    })

а затем просмотрите новые данные с помощью следующего кода.

queryRef?.queryLimited(toLast: 1).observe(.childAdded, with: { (snapshot) in

 //Your Code

        })

Ответ 5

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

ref.orderByChild('createdAt').startAt(Date.now()).on('child_added', ...