Чтение фактических записей Firebase на основе их идентификаторов

Допустим, у меня есть структура базы данных Firebase Realtime, в которой есть пользовательские узлы, и каждый пользовательский узел имеет почтовые узлы, которые содержат только идентификаторы сообщений. Кроме того, есть также отдельные пост-узлы, в которых находятся фактические посты (плоское структурирование данных). Структура подробно описана в этом ответе.

Теперь, если я могу получить идентификаторы сообщений каждого пользователя, подключив прослушиватель к узлу сообщений этого пользователя, как я могу получить сами сообщения (полную информацию из узла сообщений)? Я знаю, что нет никаких запросов, по которым можно передать кучу ключей и получить связанные записи. Должен ли я просто прикрепить слушателя к каждому интересующему меня почтовому узлу? В настоящее время я боюсь, что могут быть серьезные проблемы с производительностью, потому что количество сообщений практически не ограничено.


person Salivan    schedule 31.03.2018    source источник


Ответы (1)


Используя точную структуру базы данных из этого post, чтобы решить вашу проблему, вам нужно дважды запросить вашу базу данных. Один раз, чтобы получить идентификаторы сообщений конкретного пользователя, который вам нужен, и второй, чтобы получить сообщения самостоятельно. Для этого используйте следующий код:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference postsRef = rootRef.child("users").child(uid).child("posts");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String postId = ds.getKey();

            DatabaseReference postIdRef = rootRef.child("posts").child(postId);
            ValueEventListener eventListener = new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for(DataSnapshot dSnapshot : dataSnapshot.getChildren()) {
                        String postName = dSnapshot.child("postName").getValue(String.class);
                        Log.d("TAG", postName);
                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {}
            };
            postIdRef.addListenerForSingleValueEvent(eventListener);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
postsRef.addListenerForSingleValueEvent(valueEventListener);
person Alex Mamo    schedule 31.03.2018
comment
Итак, вот что я сказал: я должен прикрепить прослушиватель к каждому почтовому узлу, за исключением того, что в вашем примере это прослушиватель событий с одним значением, поэтому я думаю, что это должно быть намного эффективнее, чем постоянное прослушивание событий на каждом почтовом узле. . Спасибо за подтверждение и разъяснение! - person Salivan; 31.03.2018