本文介绍了从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检索复杂的嵌套数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-27 06:24
查看更多