首页 > 解决方案 > 如何访问 Firebase 数据库中动态添加的孩子的孩子?

问题描述

我知道如何访问“结果”,因为它有一个永不改变的可靠名称。但是“结果”下的孩子是动态添加的。我如何能够遍历“结果”的孩子,然后访问“数据”?

对于“结果”下的每个孩子,我想制作一个卡片视图,该卡片视图将在回收器查看器中设置,TextView 中的“基准”和 Imageview 中的(Base64)字符串。

在此处输入图像描述

编辑 我试过这个:

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) {

                    }
                });

标签: androidfirebase-realtime-database

解决方案


您正在getReference("users").child("results");数据库中创建对的引用。但是没有/users/results,所以snapshot你得到的将是空的。

因此,您需要加载整个users节点,然后results从每个子节点获取:

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 文档在其最佳实践中明确建议不要这样做。

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


推荐阅读