Firebase child_added получает только добавление ребенка
Из API Firebase:
Child Added: Это событие будет запускаться один раз для каждого исходного ребенка в этом месте, и он будет запускаться снова каждый раз, когда новый добавлен ребенок.
Некоторые коды:
listRef.on('child_added', function(childSnapshot, prevChildName) {
// do something with the child
});
Но так как функция вызывается один раз для каждого ребенка в этом месте, есть ли способ получить только тот, который был добавлен на самом деле?
Ответы
Ответ 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', ...