Firebase onChildAdded用于新数据

Vin*_*raj 7 android firebase firebase-realtime-database

如果我的firebase引用中存储了50,000个项目的列表,并且自上次客户端在线和侦听以来已经将5个项目添加到该列表中,那么我必须使用哪个回调才会触发5已添加的新项目?

我在我的客户端启用了离线持久性Firebase.getDefaultConfig().setPersistenceEnabled(true);.我有一个监听器绑定到一个活动,听取孩子们添加到参考.每次onChildAdded为参考中的所有数据调用创建活动.是否有可能只为我的本地缓存和firebase服务器上的数据之间的"diff"进行调用onChildAddedonChildRemoved调用?或者,如果那不可能,那么在onChild*firebase的最新更新之后只触发那些回调?

Fra*_*len 11

每次为onChildAdded创建活动时,都会为引用中的所有数据调用.有可能只为我的本地缓存和firebase服务器上的数据之间的"diff"调用onChildAdded和onChildRemoved吗?

不,这是不可能的.从事件类型文档:

child_added为每个现有子项触发一次,然后每次将新子项添加到指定路径时再次触发

现在回到你最初的问题:

我必须使用哪个回调才会触发已添加的5个新项目?

那将是:

ref.limitToLast(5)...
Run Code Online (Sandbox Code Playgroud)

但这要求您知道自上次收听以来已将多少项添加到列表中.

更常见的解决方案是跟踪您已经看过的最后一个项目,然后用于startAt()开始从您最后的位置开始发送事件:

ref.orderByKey().startAt("-Ksakjhds32139")...
Run Code Online (Sandbox Code Playgroud)

然后,您将保留在共享首选项中看到的最后一个密钥.

同样,您可以通过以下方式保持上次活动可见:

long lastActive = new Date().getTime();
Run Code Online (Sandbox Code Playgroud)

然后为每个项添加一个timestamp,Firebase.ServerValue.TIMESTAMP然后:

ref.orderByChild("timetstamp").startAt(lastActive+1)...
Run Code Online (Sandbox Code Playgroud)