如何仅从 Firebase 获取没有现有数据的新数据?

IT技术 javascript firebase
2021-01-19 12:48:51

我在 Firebase 中有一个节点不断更新日志文件中的信息。节点是,lines/并且每个子节点都lines/来自 a,post()因此它具有唯一的 ID。

当客户端第一次加载时,我希望能够获取最后一个X条目数。我希望我会用once(). 但是,从那时起,我想使用on()withchild_added来获取所有新数据。但是,child_added获取存储在 Firebase 中的所有数据,并且在初始设置之后,只需要新的东西。

我看到我可以在limitToLast()添加on(),但是,如果我说limitToLast(1)并且大量条目进入,我的应用程序是否仍会获得所有新条目?有没有其他方法可以做到这一点?

4个回答

您需要包含一个timestamp属性并运行查询。

// 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 
});

Firebase SDK 具有排序orderByChild()方法和创建 range 的方法startAt()当您将两者结合起来时,您可以限制从 Firebase 返回的内容。

您的解决方案中的问题是,new Date().getTime()如果客户端设备未同步,可能无法获得正确的时间戳。
2021-03-23 12:48:51

我认为@David East 的解决方案存在问题。他正在使用本地时间戳,如果客户端设备中的时间不准确,这可能会导致问题。这是我建议的解决方案(iOS Swift):

  • 使用observeSingleEvent获取完整的数据集
  • 然后以相反的顺序返回它 reversed()
  • 获取最后一个时间戳,例如 data[0].timestamp
  • 使用queryStarting的时间戳

     self._dbref.queryOrdered(byChild: "timestamp").queryStarting(atValue: timestamp+1)
         .observe(.childAdded, with: {
            snapshot in
            print(snapshot.value)
      })
    

你有正确的想法。child_added应该只为新节点调用。如果没有源代码,很难说出为什么要在child_added事件中获得所有数据

您可以查看聊天演示应用程序以了解它们如何加载新的聊天消息。用例听起来很相似。

https://github.com/firebase/firechat/blob/master/src/js/firechat.js#L347

child_added事件针对所有数据触发,然后针对新节点触发因此,他需要结合使用时间戳和查询来仅获取某个点之后的最新节点。
2021-03-23 12:48:51

这是临时但快速的解决方案:

// define a boolean
var bool = false;

// fetch the last child nodes from firebase database
ref.limitToLast(1).on("child_added", function(snap) {
    if (bool) {
        // all the existing child nodes are restricted to enter this area
        doSomething(snap.val())
    } else {
        // set the boolean true to doSomething with newly added child nodes
        bool = true;
    }
});

缺点:会加载所有的子节点。

优点:不会处理现有的子节点,只处理新添加的子节点。

limitToLast(1) 会做的工作。