Android 如何访问Firebase数据库中动态添加的子项的子项?

Android 如何访问Firebase数据库中动态添加的子项的子项?,android,firebase-realtime-database,Android,Firebase Realtime Database,我知道如何访问“结果”,因为它有一个不变的固定名称。但“结果”下的子项是动态添加的。我如何迭代“结果”的子项,然后访问“数据” 对于“结果”下的每个子项,我想创建一个cardview,该cardview将在一个recyclerviewer中设置,其中“基准”在TextView中,而(Base64)字符串在Imageview中 编辑 我试过这个: resultsRef = FirebaseDatabase.getInstance().getReference("users")

我知道如何访问“结果”,因为它有一个不变的固定名称。但“结果”下的子项是动态添加的。我如何迭代“结果”的子项,然后访问“数据”

对于“结果”下的每个子项,我想创建一个cardview,该cardview将在一个recyclerviewer中设置,其中“基准”在TextView中,而(Base64)字符串在Imageview中

编辑 我试过这个:

resultsRef = FirebaseDatabase.getInstance().getReference("users").child("results"); 

resultsRef.addListenerForSingleValueEvent(new ValueEventListener() {
                    @RequiresApi(api = Build.VERSION_CODES.O)
                    @Override
                    public void onDataChange(@NonNull DataSnapshot snapshot) {

                        for (DataSnapshot ds: snapshot.getChildren()) {
                            String datumStr = ds.child("datum").getValue(String.class);
                            holder.datum.setText(datumStr);
                        }

                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError error) {

                    }
                });

您正在创建对
getReference(“用户”).child(“结果”)的引用在数据库中。但是没有
/users/results
,因此您得到的
快照将是空的

因此,您需要对整个
用户
节点进行laod,然后从每个子节点获取
结果

resultsRef = FirebaseDatabase.getInstance().getReference("users").child("results"); 

resultsRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        for (DataSnapshot userSnapshot: snapshot.getChildren()) {
            DataSnapshot resultsSnapshot: userSnapshot.getChild("results");
            for (DataSnapshot resultSnapshot: resultsSnapshot.getChildren()) {
                String datumStr = ds.child("datum").getValue(String.class);
                holder.datum.setText(datumStr);
            }
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
        throw error.toException(); // don't ignore errors
    }
});
请注意,上面给出的快照有意义的名称有助于理解它们实际上指的是什么


另外:您将不同类型的数据(用户配置文件及其结果)嵌套在一个顶级节点下,Firebase文档在其应用程序中明确建议不要这样做


当前方法的一个缺点是,例如,为了显示用户名列表,最终也会加载所有这些用户的所有结果。即使这不是你的应用程序的安全问题,也肯定是对带宽的浪费。

那么你想得到“结果”节点中每个子节点的“数据”值吗?@AlexMamo是的,这就是我想要的。我用我试过的做了一次编辑。仍然没有像那样工作,但我的方向正确吗?它现在有点工作了,但它只得到了最后的结果。我应该如何将它从登录活动传递到另一个片段?现在我正在使用SharedRef,但我认为这不是正确的方法。我应该改用Bundle吗?“它只获取结果的最后一个子项”更有可能获取所有结果,但只显示holder中的最后一个,因为
holder.datum.setText(datumStr)
覆盖了所有以前的结果。你必须自己弄清楚如何显示多重结果;我的回答只是想指出为什么您不能用现有代码从Firebase获取数据,以及解决这个问题的一种方法。将它们以捆绑和/或SharedPref的形式传递都可以。或者您也可以在下一个活动中重新加载它们。任何对你有用的东西。它也在复制recyclerview中的最后一项。谢谢你的帮助。它解决了我最初的第一个问题!