我正在使用 orderByKey
()运行查询,如下所示:-
private ChildEventListener childEventListener=new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
Log.d("DEBUG",String.valueOf(snapshot.getValue()));
}
@Override
public void onChildChanged(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot snapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
};
DatabaseReference ref=FirebaseDatabase.getInstance().getReference("/data");
Query query=ref.orderByKey();
query.addChildEventListener(childEventListener);
然后,当我使用多个设备将孩子添加到ref
时
ref.push().setValue("someValue");
我希望Log
方法内的onChildAdded()
按照数据库中显示的排序顺序打印子级。但是实际上它首先打印了设备本身添加的子级(因为触发了监听器立即针对本地事件进行排序),然后对其他子项进行排序。我认为这超出了查询数据排序的目的。
有什么办法可以解决这个问题?
编辑: 假设两个设备同时运行上面显示的查询。 在设备1中:
ref.push().setValue("I am device 1");
在设备2中:
ref.push().setValue("I am device 2");
在此之后,如果我查看数据库,则会看到以下内容:-
data:
-MD_hQfTlzo9fH03mbjT:I am device 1
-MD_hQkXqB0nEZiGdy5A:I am device 2
所以我希望两个设备的childeventlistener中的数据排序方式相同。在设备1中,日志输出为:
I am device 1
I am device 2
但是在设备2中,日志输出为:
I am device 2
I am device 1
答案 0 :(得分:0)
onChildAdded
不会在要查询的节点下提供整个子集。最初执行查询后,将按查询指定的顺序为每个子对象{strong>在查询时 调用一次onChildAdded
。只要侦听器仍处于连接状态,此后添加的每个其他子项都会收到另一个对onChildAdded
的调用。同样,它不会重新分发以前添加的子项。
如果要在查询的每个节点发生更改时按顺序交付整个子集,则不应使用ChildEventListener
。您应该改用ValueEventListener
。