【问题标题】:Retrieve complex nested data from firebase从 firebase 检索复杂的嵌套数据
【发布时间】:2019-08-23 22:19:42
【问题描述】:

我在 firebase 中有如下数据:

我想获取每个表单 ID 的客户和设备详细信息。表单 ID 由 firebase 唯一生成。 我只是需要以某种方式访问​​这些表单 ID。

我已将databaseReference设置如下:

databaseReference = FirebaseDatabase.getInstance().getReference("users").child(userID).child("forms");

然后我尝试了以下代码来检索所需的数据:

databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot formsSnapshot : dataSnapshot.getChildren()) {
                    for (DataSnapshot formIDSnapshot : formsSnapshot.getChildren()) {

                        Device device = formIDSnapshot.getValue(Device.class);
                        if (device != null) {
                            // get and use the data
                        }
                    }
                }
            }

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

            }
        });

更新: 感谢@Frank 的回答,我现在可以成功检索表单ID。 现在,要获取设备和客户详细信息,我必须在获取表单 ID 后在 ValueEventListener 中编写以下代码:

databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot formsSnapshot : dataSnapshot.getChildren()) {
                    String formID = formsSnapshot.getKey();    //Retrieving the formID here

            //New code addition
            // to get the reference to device details node
                    databaseReference.child(Objects.requireNonNull(formID)).child("Device details").addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                            Device device = dataSnapshot.getValue(Device.class);
                            if (device != null) {
                                // required device details here
                            }
                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) {
                            throw databaseError.toException();
                        }
                    });

            // to get the reference to customer details node
              databaseReference.child(Objects.requireNonNull(formID)).child("Customer details").addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                            Customer customer = dataSnapshot.getValue(Customer.class);
                            if (customer != null) {
                                //required customer details here
                            }
                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) {
                            throw databaseError.toException();
                        }
                    });
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                throw databaseError.toException();
            }
        });

我知道这是一个杂乱无章的代码,我希望得到一些更简洁的方法。

【问题讨论】:

  • 这样你就可以访问数据,剩下的就是每个文档的 id 了吗?

标签: android firebase-realtime-database


【解决方案1】:

您可以通过调用DataSnapshot.getKey() 获取节点的密钥。因此,要获取您的表单 ID:

databaseReference = FirebaseDatabase.getInstance().getReference("users").child(userID).child("forms");

databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot formsSnapshot : dataSnapshot.getChildren()) {
                String formID = formsSnapshot.getKey();
                Device device = formsSnapshot.getValue(Device.class);
                if (device != null) {
                    // get and use the data
                }
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            throw databaseError.toException(); // never ignore errors
        }
    });

【讨论】:

  • 谢谢。这就是我所缺少的。但正如我所假设的,获取 FormID 不需要嵌套的 for 循环。我已经按照它的工作方式编辑了代码。
【解决方案2】:

不需要嵌套循环。只需获取子列表并循环一次。在每次迭代中,将 dataSnapshot 转换为 FormID 类,然后使用其属性。 如果您不需要一直观察数据,我还建议您使用 SingleValueEventListener 而不是 ValueEventListener

【讨论】:

    猜你喜欢
    • 2017-12-22
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多