有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用特定的orderby从包含多个子节点的FireBase数据库检索数据

我一直试图在不知道“蓝色”键的值的情况下检索“红色”的数据(假设有多个具有随机键的子项),但我找不到合适的代码。 这是Firebase儿童树

db image

我试图写这段代码,但没有成功(我是初学者)

 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},但不获取子项

image


共 (3) 个答案

  1. # 1 楼答案

    所以我发现这对我来说很有效

    DatabaseStage = FirebaseDatabase.getInstance().getReference("Stages").child(stageid).child("userEtudList");
    DatabaseStage.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                mData.clear();
                for(DataSnapshot data:dataSnapshot.getChildren()){
                    mData.add(data);
    
  2. # 2 楼答案

    为了回答这个问题,我将您的问题解释为“我想在所选Stages节点的userEtudList节点中生成一个所有值的列表,而不考虑它们的键。(例如,告诉我哪些学生在该课程中)。同样,您处理test的代码值实际上只是测试代码,与此挑战无关


    你的问题是dataSnapshot并不是一个真正的节点。它是进行查询的数据库级别上所有匹配节点的集合。在这种情况下,因为你的equalTo而只有一个项目这一事实并不重要。(例如,想象一下,如果没有查询中的equalTo调用,这段代码是如何工作的,因为它不知道从快照中的哪个项获取userEtudList子项!)。这就是为什么当您试图获取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.

    要解决这个问题,您可能应该断言^{,然后:

    Iterable<DataSnapshot> stagedata = dataSnapshot.getChildren()
        .iterator().next()
        .child("userEtudList").getChildren();
    

    如果您能够以某种方式依赖于密钥名始终等于uniqueId(我不清楚为什么要将uniqueId存储为密钥以外的内容//可能,这只是使用数据库屏幕截图的产物),您可以通过以下方式避免这种情况:

    Iterable<DataSnapshot> stagedata = dataSnapshot.child(stageid)
        .child("userEtudList").getChildren();
    

    当然,在这种情况下,可以删除整个查询,您可以首先直接检索这个节点

  3. # 3 楼答案

    Firebase数据库查询最多只能有一个未知密钥。因此,除非知道2fded...fd47键和0键中的任何一个,否则无法查找您用红色标记的特定节点