Firebase实时数据库查询Android

时间:2020-07-31 14:40:06

标签: firebase firebase-realtime-database

我正在使用 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

1 个答案:

答案 0 :(得分:0)

onChildAdded不会在要查询的节点下提供整个子集。最初执行查询后,将按查询指定的顺序为每个子对象{strong>在查询时 调用一次onChildAdded。只要侦听器仍处于连接状态,此后添加的每个其他子项都会收到另一个对onChildAdded的调用。同样,它不会重新分发以前添加的子项。

如果要在查询的每个节点发生更改时按顺序交付整个子​​集,则不应使用ChildEventListener。您应该改用ValueEventListener