Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 874
mix Avatar asked Nov 24 '15 03:11

mix


2 Answers

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.

like image 105
David East Avatar answered Oct 03 '22 05:10

David East


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 timestamp

     self._dbref.queryOrdered(byChild: "timestamp").queryStarting(atValue: timestamp+1)
         .observe(.childAdded, with: {
            snapshot in
            print(snapshot.value)
      })
    
like image 38
Bagusflyer Avatar answered Oct 03 '22 05:10

Bagusflyer