Retrieve complex nested data from firebase

让人想犯罪 __ 提交于 2021-01-29 02:56:26

问题


I have the data in firebase as given below:

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.

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) {

            }
        });

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.


回答1:


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



回答2:


There is no need for the nested loops. Simply get the children list and loop over it once. At every iteration, cast dataSnapshot to FormID class and afterwards just use its properties. i would also suggest that you use SingleValueEventListener instead of ValueEventListener if you do not need to observe the data all the time



来源:https://stackoverflow.com/questions/57617111/retrieve-complex-nested-data-from-firebase

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!