snapshot.getChildren() 打印值,而 getValue() 返回 null

Posted

技术标签:

【中文标题】snapshot.getChildren() 打印值,而 getValue() 返回 null【英文标题】:snapshot.getChildren() prints the values while getValue() returns null 【发布时间】:2021-12-10 07:57:51 【问题描述】:

我在快照能够打印值时遇到问题,但是通过使用获取值来指定返回 null。

我正在尝试检索上传到 Firebase 的列表,并将其与用户将通过的列表进行比较。

 rootReference.addListenerForSingleValueEvent(new ValueEventListener() 
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) 
            for (DataSnapshot item_child : snapshot.getChildren())
            
                String recId = item_child.getKey();
                DatabaseReference rootReference = FirebaseDatabase.getInstance("https://what-s-cookin-a3bec-default-rtdb.asia-southeast1.firebasedatabase.app/")
                        .getReference().child("Recipes").child(recId);

                Log.d(TAG, "RECID: " + recId);
                rootReference.addListenerForSingleValueEvent(new ValueEventListener() 
                    @Override
                    public void onDataChange(@NonNull DataSnapshot snapshot) 
                        for (DataSnapshot ds : snapshot.getChildren())
                        
                            Log.d(TAG, "SNAPSHOT: " + ds);
                            Log.d(TAG, "SPECIFIC: " + ds.child("ingredients"));
                            if(ds.child("ingredients").getValue() != null)
                            
                                Log.d(TAG, "INGREDIENTS NOT NULL");
                                ArrayList<String> ing = new ArrayList<String>();
                                for (DataSnapshot ings : snapshot.child("ingredients").getChildren())
                                
                                    ing.add(ings.getValue(String.class));
                                    Log.d(TAG, "DS: " + ds);
                                    Log.d(TAG, "INGS: " + ings);
                                

这是 logcat 的结果:

SNAPSHOT: DataSnapshot  key = ingredients, value = 0=Fish, 1=bitter, 2=cilantro 
SPECIFIC: DataSnapshot  key = ingredients, value = null 

Logcat screenshot

这是我们的火力基地: Firebase Screenshot

食谱 1634971267099 收藏数:8 编号:“1634971267099” imageUrl:“https://firebasestorage.googleapis.com/v0/b/wha...” 配料 0:“鱼” 1:“苦” 2:“香菜” 主菜:“猪肉” 测量:“测试” 名称:“波切罗” 产品:“测试” 发球:“15” 时间:“30” uid:“tMdUFcAelyeVo5DYW3P7HolRW4S2”

【问题讨论】:

您的第二个 for 循环超过 snapshot.child("ingredients").getChildren(),但应该是 ds.child("ingredients").getChildren()。我强烈建议使用有意义的变量名来防止此类错误。 谢谢,但这不是问题。我将变量更改为您建议的变量,但仍然出现同样的问题。当我使用 getChildren() 时,它会打印出数据库中的所有内容,但是当我专门将其称为 child.("ingredients").getValue() 时,它会返回 null 这绝对是您代码中的问题之一。您首先检查if(ds.child("ingredients").getValue(),然后使用for (DataSnapshot ings : snapshot.child("ingredients").getChildren()) 循环,因此您在其中一个中使用了错误快照的ingredients 子项。如果您解决了这个问题但仍然遇到同样的问题,请编辑您的问题以显示更新后的代码。 【参考方案1】:

检查您的代码是否与 Firebase 数据匹配。 如果您发布 Firebase 数据的屏幕截图以了解数据库层次结构,会更清楚。

很难从你的代码中理解数据库结构。

【讨论】:

我编辑了问题并添加了 firebase 层次结构。对此感到抱歉

以上是关于snapshot.getChildren() 打印值,而 getValue() 返回 null的主要内容,如果未能解决你的问题,请参考以下文章

打印机取消双面打印

如何查看打印机的打印设置和取消打印啊

打印机如何取消打印任务

怎么设置打印机默认一张,无需选择打印机直接打印

打印机如何取消打印任务

惠普打印机彩墨没了,只有黑墨可以打印吗?