java使用特定的orderby从包含多个子节点的FireBase数据库检索数据
我一直试图在不知道“蓝色”键的值的情况下检索“红色”的数据(假设有多个具有随机键的子项),但我找不到合适的代码。 这是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。它允许我选择一个特定的子项,即第二个子项
下面是使用断点获得的变量的状态,因为您可以看到Datasnapshot,它一直获取{key=userEtudList,Value=null},但不获取子项
# 1 楼答案
所以我发现这对我来说很有效
# 2 楼答案
为了回答这个问题,我将您的问题解释为“我想在所选
Stages
节点的userEtudList
节点中生成一个所有值的列表,而不考虑它们的键。(例如,告诉我哪些学生在该课程中)。同样,您处理test
的代码值实际上只是测试代码,与此挑战无关你的问题是
dataSnapshot
并不是一个真正的节点。它是进行查询的数据库级别上所有匹配节点的集合。在这种情况下,因为你的equalTo
而只有一个项目这一事实并不重要。(例如,想象一下,如果没有查询中的equalTo
调用,这段代码是如何工作的,因为它不知道从快照中的哪个项获取userEtudList
子项!)。这就是为什么当您试图获取userEtudList
子对象时,快照是空的Doc Reference要解决这个问题,您可能应该断言^{,然后:
如果您能够以某种方式依赖于密钥名始终等于
uniqueId
(我不清楚为什么要将uniqueId
存储为密钥以外的内容//可能,这只是使用数据库屏幕截图的产物),您可以通过以下方式避免这种情况:当然,在这种情况下,可以删除整个查询,您可以首先直接检索这个节点
# 3 楼答案
Firebase数据库查询最多只能有一个未知密钥。因此,除非知道
2fded...fd47
键和0
键中的任何一个,否则无法查找您用红色标记的特定节点