Firebase onChildAdded用于新数据

时间:2016-01-12 13:39:38

标签: android firebase firebase-realtime-database

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

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

2 个答案:

答案 0 :(得分:11)

  

每次为onChildAdded创建活动时,都会为引用中的所有数据调用。是否可以使onChildAdded和onChildRemoved仅为" diff"在我的本地缓存和firebase服务器上的数据之间?

不,这是不可能的。来自documentation on event types

  

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

现在回到你的初步问题:

  

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

那将是:

ref.limitToLast(5)...

但这需要您知道自上次收听以来已添加到列表中的项目数。

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

ref.orderByKey().startAt("-Ksakjhds32139")...

然后,您将保留在共享偏好设置中看到的最后一个密钥。

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

long lastActive = new Date().getTime();

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

ref.orderByChild("timetstamp").startAt(lastActive+1)...

答案 1 :(得分:1)

您应该使用on('child_changed')。通常,@model MyModel @using (Html.BeginForm()) { @Html.LabelFor(m => m.Department) @Html.DropDownListFor(m => m.Department, Model.DepartmentList, "Select Department") @Html.ValidationMessageFor(m => m.Department) <input type="submit" value="Save" /> } 用于侦听特定位置的数据更改。但是,public ActionResult Populate() { MyModel model = new MyModel(); ConfigureViewModel(model); return View(model); } [HttpPost] public ActionResult Populate(MyModel model) { if (!ModelState.IsValid) { ConfigureViewModel(model); return View(model); } // Save and redirect. } private void ConfigureViewModel(MyModel model) { model.DepartmentList = new SelectList(db.Depts, "DeptCode", "DeptName"); } 通知您

  

存储在儿童( 或其任何后代 )中的数据发生变化时。

它会将数据快照传递给包含新子内容的回调。请注意,单个>>> import platform >>> platform.python_implementation() 'CPython' 事件可能代表对子项的多项更改。