Firebase UI: решение получить все ключи от дочернего элемента и использовать его для получения информации от другого узла и заполнения ее в Recyclerview? - PullRequest
0 голосов
/ 11 января 2019

Я ищу решение для получения данных от моего "лекарства" и использую идентификаторы для получения конкретных данных из узла "medication_plan" и отображения их в Recyclerview.

DB-структура:

В настоящее время я использую пользовательский интерфейс Firebase, чтобы заполнить свой Recyclerview

private DatabaseReference mRef;

private RecyclerView mRecyclerView;
private RecyclerView.LayoutManager mLayoutManager;
private FirebaseRecyclerAdapter<Medication,MedicationViewHolder> mAdapter;

List<User> items = new ArrayList<>();

User user = new User();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mRecyclerView = findViewById(R.id.my_recycler_view);
    mRecyclerView.setHasFixedSize(true);

    mLayoutManager = new LinearLayoutManager(this);
    mRecyclerView.setLayoutManager(mLayoutManager);

    setData();
}

private void setData() {
    Query query = FirebaseDatabase.getInstance().getReference().child("Medication_plan");
    FirebaseRecyclerOptions<Medication> options = new FirebaseRecyclerOptions.Builder<Medication>()
            .setQuery(query,Medication.class)
            .build();

    mAdapter = new FirebaseRecyclerAdapter<Medication, MedicationViewHolder>(options) {
        @Override
        protected void onBindViewHolder(@NonNull MedicationViewHolder holder, int position, @NonNull Medication model) {
            final Medication tempmed = new Medication(model.getDr()
                    ,model.getMedicine()
                    ,model.getDate()
                    ,model.getComment());

            holder.mDoctor.setText(model.getDr());
            holder.mMedicine.setText(model.getMedicine());
            holder.mDate.setText(model.getDate());
        }

        @NonNull
        @Override
        public MedicationViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
            View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.my_text_view,viewGroup,false);
            MedicationViewHolder vh = new MedicationViewHolder(v);
            return vh;
        }
    };

    mRecyclerView.setAdapter(mAdapter);
}

@Override
protected void onStart() {
    mAdapter.startListening();
    super.onStart();
}

@Override
protected void onStop() {
    mAdapter.stopListening();
    super.onStop();
}

Когда я использую этот код, я получаю каждый план приема лекарств, но мне нужны только конкретные планы от пользователя.

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Чтобы получить только лекарство, соответствующее конкретному пользователю, вам нужно дважды запросить базу данных. Один раз, чтобы получить идентификаторы лекарств, а второй, чтобы получить информацию о ваших лекарствах, как в следующих строках кода:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference medicationRef = rootRef.child("User").child("r3").child("medication");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String medicationKey = ds.getKey();

            DatabaseReference medicationKeyRef = rootRef.child("Medication_plan").child(medicationKey);
            ValueEventListener eventListener = new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for(DataSnapshot ds : dataSnapshot.getChildren()) {
                        Medication medication = ds.getValue(Medication.class);
                        Log.d(TAG, medication.getMedicine());
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
                    Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
                }
            };
            medicationKeyRef.addListenerForSingleValueEvent(eventListener);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
medicationRef.addListenerForSingleValueEvent(valueEventListener);

Вывод в logcat будет:

Aspirin
Paracetamol

Кроме того, вам также следует упростить узел User, как показано в следующей схеме:

Firebase-root
   |
   --- User
        |
        --- R3
            |
            --- lastname: "Hirsch"
            |
            --- medication
            |      |
            |      --- 1234: true
            |      |
            |      --- assf12: true
            |
            --- name: "Rob"

Приведенный выше код также будет работать для этой структуры.

0 голосов
/ 12 января 2019

Добавьте эту функцию, чтобы получить ваши данные:

ArrayList<String> list = new ArrayList<String>();
DatabaseReference ref= FirebaseDatabase.getInstance().getReference("User").child("R3").child("medication");
ref.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot snap: dataSnapshot.getChildren()) {
            list.add(snap.child("id").getValue(String.class));
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.w(TAG, "onCancelled", databaseError.toException());
    }
});

После этого добавьте этот код, чтобы получить вторую информацию о данных:

ArrayList<String> listOfSomething = new ArrayList<String>();
DatabaseReference ref=  FirebaseDatabase.getInstance().getReference("Medication_plan");
ref.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (String s: list) {
            listOfSomething.add(dataSnapshot.child("s").child("comment").getValue(String.class));
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.w(TAG, "onCancelled", databaseError.toException());
    }
});

в моем примере я получаю комментарии. Вы можете изменить его так, как хотите.

...