如果我的firebase参考中存储了50,000个项目的列表,并且自上次客户端在线和收听以来已经将5个项目添加到该列表中,我必须使用哪个回调才会触发对于已添加的5个新项目?
我的客户端Firebase.getDefaultConfig().setPersistenceEnabled(true);
启用了离线持久性。我有一个监听器绑定到一个活动,听取孩子们添加到参考。每次创建活动时,都会为引用中的所有数据调用onChildAdded
。是否可以仅为我的本地缓存和firebase服务器上的数据之间的“diff”调用onChildAdded
和onChildRemoved
?或者如果那不可能,那么在firebase的最新更新之后只触发那些onChild*
回调?
答案 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'
事件可能代表对子项的多项更改。