How to only get new data without existing data from a Firebase?
I have a node in Firebase getting continually updated with information from a logfile. The node is lines/
and each child of lines/
is from a post()
so it has a unique ID.
When a client first loads, I want to be able to grab the last X
number of entries. I expect I'll do this with once()
. From then on, however, I want to use an on()
with child_added
so that I get all new data. However, child_added
gets all data stored in the Firebase and, after the initial setup, only want the new stuff.
I see that I can add a limitToLast()
on the on()
, but, if I say limitToLast(1)
and a flood of entries come in, will my app still get all the new entries? Is there some other way to do this?
Solution 1:
You need to include a timestamp
property and run a query.
// Get the current timestamp
var now = new Date().getTime();
// Create a query that orders by the timestamp
var query = ref.orderByChild('timestamp').startAt(now);
// Listen for the new children added from that point in time
query.on('child_added', function (snap) {
console.log(snap.val()
});
// When you add this new item it will fire off the query above
ref.push({
title: "hello",
timestamp: Firebase.ServerValue.TIMESTAMP
});
The Firebase SDK has methods for ordering, orderByChild()
and methods for creating a range startAt()
. When you combine the two you can limit what comes back from Firebase.
Solution 2:
I think there is a problem in @David East's solution. He is using the local timestamp which may cause problem if the time is not accurate in client device. Here is my suggested solution (iOS Swift):
- Using
observeSingleEvent
to get the complete data set - Then returned it in reversed order by
reversed()
- Get the last timestamp by for example
data[0].timestamp
-
Using
queryStarting
for timestampself._dbref.queryOrdered(byChild: "timestamp").queryStarting(atValue: timestamp+1) .observe(.childAdded, with: { snapshot in print(snapshot.value) })