我一直在尝试在不知道“蓝色”键值的情况下检索“红色”数据(假设有多个具有随机键的子项),但我无法提供适当的代码。 这是 Firebase 子树。
我尝试编写此代码,但它不起作用(我是初学者)
List<String> idlist = new ArrayList<String>();
DatabaseStage = FirebaseDatabase.getInstance().getReference("Stages");
Query query = DatabaseStage.orderByChild("uniqueId").equalTo(stageid);
query.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Iterable<DataSnapshot> stagedata = dataSnapshot.child("userEtudList").getChildren();
for(DataSnapshot it: stagedata){
if (!(it.getValue().equals("test"))){
idlist.add(it.getValue().toString());
}
}
Ps:如果您想知道 orderByChild(uniqueId).equalTo(stageid) 的使用,在这种情况下 stageid 等于 2fdedf71-4346-4395-bee5-38db04d4fd47 它允许我选择一个特定的子级,即第二个一个。
这是使用断点获取的变量的状态,您可以看到它不断获取 {key = userEtudList , Value =null} 但没有获取 Children 的 Datasnapshot
最佳答案
出于此答案的目的,我将您的问题解释为“我想在所选 的
节点。(例如,告诉我该类(class)中有哪些学生)。同样,处理 userEtudList
节点中生成所有值的列表,而不考虑它们的键Stagestest
值的代码实际上只是测试代码,与此无关挑战。
您的问题是 dataSnapshot
并不是真正的单个节点。它是您进行查询的数据库级别的所有匹配节点的集合。在这种情况下,由于您的 equalTo
而只有一项这一事实并不重要。 (例如,想象一下在查询中没有 equalTo
调用的情况下这段代码如何工作 - 它不能,因为它不知道快照中的哪个项目要获取 userEtudList
child 从!)。这就是为什么当您尝试获取 userEtudList
子项时快照为空的原因。 Doc Reference
Calling getValue() on a snapshot returns the Java object representation of the data. If no data exists at the location, calling getValue() returns null.
要解决此问题,您可能应该断言 dataSnapshot.getChildrenCount() == 1
,然后:
Iterable<DataSnapshot> stagedata = dataSnapshot.getChildren()
.iterator().next()
.child("userEtudList").getChildren();
如果您能够以某种方式依赖于始终等于 uniqueId
的键名称(我不清楚为什么您将 uniqueId
存储为键以外的其他内容)无论如何//可能,这只是使用数据库屏幕截图的产物)您可以通过以下方式避免这种情况:
Iterable<DataSnapshot> stagedata = dataSnapshot.child(stageid)
.child("userEtudList").getChildren();
当然,在这种情况下,可以删除整个查询,直接检索该节点即可。
关于java - 使用特定 orderby 从包含多个子节点的 FireBase 数据库检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59010091/