【问题标题】:Firebase RealTime Database: How iterate each key valueFirebase 实时数据库:如何迭代每个键值
【发布时间】: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 时,它会做什么?你期望它做什么?我也推荐阅读:stackoverflow.com/questions/66832359/…
  • for(DataSnapshot i : snapshot.getChildren()) {temp += i.getKey() + ", ";} 在此代码行中,我希望所有子名称都像 [Demo Company, Demo Company 2, Demo Company 3],会出现但我只得到一个名字 [Demo Company 2]。

标签: android json firebase-realtime-database


【解决方案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 对我有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-12
相关资源
最近更新 更多