I have 2 reference points. Services and servicetypes. Now as you can see servicetypes has a foreign key for each service. see below image: Here
Now I want to set value listener in both points and read data and display them in a RecyclerView. Each service has multiple service types.
I have done it like this
database = FirebaseDatabase.getInstance();
myRef = database.getReference(getString(R.string.services));
Query userQuery=myRef.child(FireBaseUtils.getFirebaseId());
userQuery.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
ArrayList<Map<String,String>> temp=new ArrayList<>();
for(DataSnapshot d: dataSnapshot.getChildren())
{
final Service s=d.getValue(Service.class);
String id=d.getKey();
Log.d("TEST", ": "+id);
serviceTypesReference=database.getReference(getString(R.string.servicetypes)).child(id);
serviceTypesReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//services.clear();
ArrayList<ServiceType> serviceTypes=new ArrayList<>();
Service tempService=new Service(s.getName());
for(DataSnapshot dd:dataSnapshot.getChildren())
{
ServiceType st= dd.getValue(ServiceType.class);
Log.d("TEST", "typename: "+st.getName());
serviceTypes.add(st);
}
tempService.setServiceTypeArrayList(serviceTypes);
services.add(tempService);
serviceAdapter=new ServiceAdapter(services);
servicesRecyclerView.setAdapter(serviceAdapter);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
} }
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
Here a service object contains a name and an ArrayList containing all service types it includes. List of these service objects is passed to the adapter of the RecyclerView.
Now, this does the job but is very inefficient and maybe can cause bugs I don't see right now. Is there a better way to do this?
Thanks in advance.