Запрос базы данных firebase в android studio с Java - PullRequest
0 голосов
/ 23 января 2020

У меня проблема с получением данных из базы данных firebase. Мне нужно собрать данные и добавить их в массив только в том случае, если в поддокументе участника присутствует текущий идентификатор пользователя.

см. Структуру базы данных: Database structure

, и вот код, который я пытаюсь использовать для разрешения.

private DatabaseReference mDB = FirebaseDatabase.getInstance().getReference().child("events");
private FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
private String userid = user.getUid();

mDB.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                try{
                    for (DataSnapshot chidSnap : dataSnapshot.getChildren()) {

                        for(DataSnapshot participant : chidSnap.child("participants").getChildren()){

                            String participantKey = participant.getKey();
                            Log.d(TAG, "onDataChange: " + participantKey);

                            String participantId = (String) participant.child(participantKey).getValue();
                            Log.d(TAG, "onDataChange: " + participantId);

                            if(participantId.equals(userid)){

                                mEventKeys.add(chidSnap.getKey()); //displays the key for the node
                                mEventNames.add((String) chidSnap.child("event_name").getValue());
                                mEventShortDescriptions.add((String) chidSnap.child("event_name").getValue());
                                mEventLongDescriptions.add((String) chidSnap.child("event_name").getValue());
                                mEventCityLocations.add((String) chidSnap.child("event_name").getValue());
                                mEventDates.add((String) chidSnap.child("event_name").getValue());
                                mEventHours.add((String) chidSnap.child("event_name").getValue());
                            }
                        }
                    }
                }catch (Exception e){
                    Log.d(TAG, "onDataChange: " + e.toString());
                }



                initRecyclerView(recyclerView);
            }

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

Можете ли вы, ребята, помочь?

А также, если у вас есть предложения о том, как мне улучшить загрузку данных с базы данных, я бы очень хотел их увидеть! У меня сложилось впечатление, что мой подход не самый оптимальный.

1 Ответ

1 голос
/ 23 января 2020

Нет необходимости получать ключ и использовать его в своей ссылке, вы можете просто l oop дважды, как в следующих строках кода:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference eventsRef = rootRef.child("events");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot snapshot : dataSnapshot.getChildren()) {
            DataSnapshot participantsSnapshot = snapshot.child("participants");
            for(DataSnapshot ds : participantsSnapshot.getChildren()) {
                String uid = ds.getValue(String.class);
                Log.d(TAG, uid);
            }
        }
    }

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

Результатом в logcat будут все uids которые существуют в массиве participants.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...