Firebase onChildAdded 获取新数据
Firebase onChildAdded for new data
如果我的 firebase 引用中存储了一个包含 50,000 个项目的列表,并且自上次客户端在线并监听以来已将 5 个项目添加到该列表中,我必须使用哪个回调,以便它是仅对已添加的 5 个新项目触发?
我使用 Firebase.getDefaultConfig().setPersistenceEnabled(true);
在我的客户端上启用了离线持久性。我有一个监听器绑定到 activity 监听添加到引用的子项。每次创建 activity 时,都会为引用中的所有数据调用 onChildAdded
。是否可以让 onChildAdded
和 onChildRemoved
仅在我的本地缓存和 firebase 服务器上的数据之间为 "diff" 调用?或者,如果那不可能,那么在 firebase 的最新更新后仅触发那些 onChild*
回调?
你应该使用 on('child_changed')。通常,on()
用于监听特定位置的数据变化。但是,on('child_changed')
会通知您
when the data stored in a child (or any of its descendants) changes.
它会将数据快照传递给包含新 child 内容的回调。请记住,单个 child_changed
事件可能代表对 child 的多个更改。
Everytime the activity is created onChildAdded is called for all the data in the reference. Is it possible to make onChildAdded and onChildRemoved be called only for "diff" between my local cache and the data on the firebase server?
不,这是不可能的。来自 documentation on event types:
child_added is triggered once for each existing child and then again every time a new child is added to the specified path
现在回到你最初的问题:
which callback would I have to use such that it is only triggered for the 5 new items that have been added?
那就是:
ref.limitToLast(5)...
但这需要您知道自上次收听以来有多少项目被添加到列表中。
更常见的解决方案是跟踪您已经看到的最后一个项目,然后使用 startAt()
从您上次所在的位置开始触发事件:
ref.orderByKey().startAt("-Ksakjhds32139")...
然后您将保留在共享首选项中看到的最后一个密钥。
同样,您可以保留 activity 上次可见的时间:
long lastActive = new Date().getTime();
然后为每个项目添加一个 timestamp
和 Firebase.ServerValue.TIMESTAMP
然后:
ref.orderByChild("timetstamp").startAt(lastActive+1)...
如果我的 firebase 引用中存储了一个包含 50,000 个项目的列表,并且自上次客户端在线并监听以来已将 5 个项目添加到该列表中,我必须使用哪个回调,以便它是仅对已添加的 5 个新项目触发?
我使用 Firebase.getDefaultConfig().setPersistenceEnabled(true);
在我的客户端上启用了离线持久性。我有一个监听器绑定到 activity 监听添加到引用的子项。每次创建 activity 时,都会为引用中的所有数据调用 onChildAdded
。是否可以让 onChildAdded
和 onChildRemoved
仅在我的本地缓存和 firebase 服务器上的数据之间为 "diff" 调用?或者,如果那不可能,那么在 firebase 的最新更新后仅触发那些 onChild*
回调?
你应该使用 on('child_changed')。通常,on()
用于监听特定位置的数据变化。但是,on('child_changed')
会通知您
when the data stored in a child (or any of its descendants) changes.
它会将数据快照传递给包含新 child 内容的回调。请记住,单个 child_changed
事件可能代表对 child 的多个更改。
Everytime the activity is created onChildAdded is called for all the data in the reference. Is it possible to make onChildAdded and onChildRemoved be called only for "diff" between my local cache and the data on the firebase server?
不,这是不可能的。来自 documentation on event types:
child_added is triggered once for each existing child and then again every time a new child is added to the specified path
现在回到你最初的问题:
which callback would I have to use such that it is only triggered for the 5 new items that have been added?
那就是:
ref.limitToLast(5)...
但这需要您知道自上次收听以来有多少项目被添加到列表中。
更常见的解决方案是跟踪您已经看到的最后一个项目,然后使用 startAt()
从您上次所在的位置开始触发事件:
ref.orderByKey().startAt("-Ksakjhds32139")...
然后您将保留在共享首选项中看到的最后一个密钥。
同样,您可以保留 activity 上次可见的时间:
long lastActive = new Date().getTime();
然后为每个项目添加一个 timestamp
和 Firebase.ServerValue.TIMESTAMP
然后:
ref.orderByChild("timetstamp").startAt(lastActive+1)...