Запрашивать объекты из Firebase, у которых есть дочернее значение в ArrayList - PullRequest
2 голосов
/ 11 мая 2019

Я пытаюсь запросить узлы из базы данных Firebase в реальном времени к моему адаптеру утилизации Firebase, где дочернее значение userId находится в String ArrayList.

Итак, у меня есть узел под названием «Follows», в котором хранятся все пользователи, которые следуют внутри приложения. Это выглядит так .Тогда у меня есть узел под названием «Посты», где хранятся все посты любого пользователя.У каждого отдельного поста есть несколько дочерних элементов, содержащих информацию о посте, и один из них называется child с именем userId. выглядит так .

Я получил каждый идентификатор пользователя следующим образом:

final ArrayList<String> usersFollows = new ArrayList<>();
                    DatabaseReference usersFollowsRef = FirebaseDatabase.getInstance().getReference().
                            child("Follows").child(currentUserId);

                    usersFollowsRef.addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot)
                        {
                            if(dataSnapshot.exists())
                            {
                                for(DataSnapshot snapshot : dataSnapshot.getChildren())
                                {
                                    String followsKey = snapshot.getKey();
                                    usersFollows.add(followsKey);
                                }
                            }
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });

Теперь мне нужно было бы сделать запрос, который извлекает каждое сообщение со значением «userId», найденным в этом ArrayList «usersFollows»но я не знаю, как достичь своей цели.Например, я не могу написать Query query = postsReference.orderByChild("userId").equalTo(usersFollows);, потому что вы не можете передать массив внутри оператора equalTo ().

Я на правильном пути или есть более удобный способ сделать это?

1 Ответ

1 голос
/ 11 мая 2019

К сожалению, firebase не позволяет использовать несколько equalTo().Я предлагаю вам просмотреть свою базу данных следующим образом: Posts -> Date -> UserId -> PostId и добавить .read правила, которые проверяют, является ли UserId в списке Follow истинным:

Posts: {
  "$date" :{
     "$userId": {
                ".read": "root.child(follows).child(auth.uid).child($userId).val() === true"
                }
           }
     }

Таким образомВы можете получить пост по дате и автоматически уменьшить область видимости.

РЕДАКТИРОВАТЬ:

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

 Posts: {
  "$post":{
        ".read": "root.child(follows).child(auth.uid).child(data.child(userId)).val() === true"
        }
     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...