firebase - 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
解决方案
onChildAdded
不传递被查询节点下的全部子节点。在查询最初执行后,onChildAdded
将在查询时按照查询指定的顺序为每个子项调用一次。只要侦听器仍处于连接状态,它就会收到onChildAdded
对之后添加的每个附加子级的另一个调用。同样,它不会重新传递先前添加的子项。
如果您希望在每次更改被查询的节点时按顺序传递整个子节点集,则不应使用ChildEventListener
. 你应该使用 aValueEventListener
代替。
推荐阅读
- python - PyTorch - AssertionError:张量之间的大小不匹配
- javascript - 堆栈跟踪中的评估是邪恶的吗?
- node.js - 为什么在通过 sudo 以 root 身份询问时,尽管安装了 NVM 和最新的 LTS,节点仍报告旧版本?
- azure-synapse - 从 Azure Synapse spark notebook 连接到 SQL-Pool 表
- java - 在 JavaFX Maven 项目的 pom.xml 文件中添加 VM 标志
- java - Hibernate 和 DispatcherServlet 初始化的关系
- python - 在 Qpython (android) 上使用 SSL 时出现错误
- excel - 使用 CreateObject("Excel.Application") 的 2 个 Excel 链接实例
- android - react-native-contacts android null 不是评估 t.givenName[0] 的对象
- java - 如何仅在第一个片段上隐藏浮动操作按钮?