Firebase 实时数据库:如何迭代每个键值

Posted

技术标签:

【中文标题】Firebase 实时数据库:如何迭代每个键值【英文标题】:Firebase RealTime Database: How iterate each key value 【发布时间】:2021-06-28 12:50:00 【问题描述】:

我的 Firebase RealTime JSON 数据库结构如下所示

首先,我想从公司简介中迭代不同的公司名称,例如 [演示公司、演示公司二、演示公司三] 在我得到这个之后,我现在想获取这个列表的子项目,这次公司名称是子引用对象,第二个列表看起来像 [Circuit 1, Circuit 2, ...]。现在我想再深入一点,这次电路名称是子引用对象,现在我想要包名称列表示例(0603,...),就像这样。

简而言之,首先我想要父名称,然后是子父名称等等,最后我想要键值对和所有父名称。

我试过的代码示例看起来像

TextView tvTestDelete = findViewById(R.id.tv_test_delete);
    mFirebaseDatabase = FirebaseDatabase.getInstance();
    mDatabaseReference = mFirebaseDatabase.getReference().child("Company Profile");
    mChildEventListener = new ChildEventListener() 
        @Override
        public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) 
            Map<String, Object> testDeleteItem = (Map<String, Object>) snapshot.getValue();
            String temp = "";
            for(DataSnapshot i : snapshot.getChildren()) 
                temp += i.getKey() + ", ";
            
            tvTestDelete.setText(temp);
        
        @Override
        public void onChildChanged(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) 
        @Override
        public void onChildRemoved(@NonNull DataSnapshot snapshot) 
        @Override
        public void onChildMoved(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) 
        @Override
        public void onCancelled(@NonNull DatabaseError error) 
    ;
    mDatabaseReference.addChildEventListener(mChildEventListener);

我是 android 和 firebase 连接及其工作原理的初学者。我真的很抱歉我的英文解释不好,如果你不明白我的问题,请问我哪一部分,我会尽力解释。请帮帮我。

我真的会提前谢谢你。

【问题讨论】:

代码的哪一部分没有按照您期望的方式运行?所以:当您在调试器中单步执行onChildAdded 时,它会做什么?你期望它做什么?我也推荐阅读:***.com/questions/66832359/… for(DataSnapshot i : snapshot.getChildren()) temp += i.getKey() + ", "; 在此代码行中,我希望所有子名称都像 [Demo Company, Demo Company 2, Demo Company 3],会出现但我只得到一个名字 [Demo Company 2]。 【参考方案1】:

由于您使用的是addChildEventListener,因此您的onChildAdded 将被/Company Profile 的子节点调用。因此,您的onChildAdded 会被调用一次,每个孩子都有该孩子的快照:Demo CompanyDemo Company ThreeDemo Company Two

onChildAdded 内部,然后您循环遍历每个子节点,因此此时您需要在 JSON 中再下一层,最后在 Demo Company/Demo Circuit 1Demo Company/Demo Circuit 2 等节点上调用 i.getKey() , 之后还有Demo Company Three/Demo Circuit 1 等。

如果您只想记录直接子节点的键,那么在您当前的代码中可以使用 snapshot.getKey()

您也可以addValueEventListener,在这种情况下,您的onDataChange 会使用所有/Company Profile 的快照调用,在这种情况下,您将像现在一样循环访问getChildren() 以获取孩子您正在寻找的节点。

【讨论】:

谢谢先生,addValueEventListener 对我有用。

以上是关于Firebase 实时数据库:如何迭代每个键值的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何在 Firebase 实时数据库中设置作为键值类型的 getter 和 setter?

在 Firebase 实时数据库中,我如何遍历每个产品并在回收站视图中显示它们的详细信息

如何使用 Firebase 实时数据库创建特定用户所有已保存帖子的列表?

如何从 Flutter 中的 Firebase 实时数据库中按 categoryId 获取产品?

如何限制用户在 Firebase 实时数据库中上传一定数量的数据

使用flutter如何在同一个App中使用多个firebase实时数据库