首页 > 解决方案 > Firebase 实时数据库查询 Android

问题描述

我正在使用()运行查询,如下所示:-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

标签: firebasefirebase-realtime-database

解决方案


onChildAdded不传递被查询节点下的全部子节点。在查询最初执行后,onChildAdded在查询时按照查询指定的顺序为每个子项调用一次。只要侦听器仍处于连接状态,它就会收到onChildAdded对之后添加的每个附加子级的另一个调用。同样,它不会重新传递先前添加的子项。

如果您希望在每次更改被查询的节点时按顺序传递整个子节点集,则不应使用ChildEventListener. 你应该使用 aValueEventListener代替。


推荐阅读