从Firebase检索复杂的嵌套数据 [英] Retrieve complex nested data from firebase

查看:42
本文介绍了从Firebase检索复杂的嵌套数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在firebase中有如下数据:

I have the data in firebase as given below:

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

I want to get the Customer and Device details for each of the Form ID. The Form IDs are generated uniquely by firebase. I just somehow need to get access to these Form IDs.

我将databaseReference设置如下:

I have set the databaseReference as follows:

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

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

Then I have tried the following code to retrieve the required data:

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中编写以下代码:

Update: I am now successfully able to retrieve the form IDs, thanks to the answer by @Frank. Now, to get the Device and Customer details I have to write the following code inside the ValueEventListener after getting the form IDs:

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();
            }
        });

我知道这是一个凌乱的代码,我希望对此使用更简洁的方法.

I understand that this is a messy code and I would like to get some cleaner approach for the same.

推荐答案

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

You can get the key of a node by calling DataSnapshot.getKey(). So to get your form IDs:

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
        }
    });

这篇关于从Firebase检索复杂的嵌套数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆