Android Firebase — денормализованные запросы с использованием FirebaseUI

Из раздела "Структурирование данных" в документации я понял, что денормализация данных полезна для достижения более эффективного поиска, когда у вас есть двусторонние отношения.

В моем приложении у меня есть денормализованная структура данных для chats и users:

{
  users: {
      user1: {
          name: "user1",
          chats: {
              chat1: true,
              chat3: true,
          }
      }
      user2: {
          name: "user2",
          chats: {
              chat2: true,
              chat3: true,
          }
      }
  chats: {
      chat1: {
          chatID: "chat1",
          chats: {
              user1: true,
          }
      }
      chat3: {
          chatID: "chat3" ,
          users: {
              user1: true,
              user2: true,
          }
      }
  }
}

Я хочу запросить в базе данных все чаты, частью которых является конкретный пользователь, и загрузить их в файл RecyclerView.

Прямо сейчас у меня есть рабочее решение, использующее FirebaseUI RecyclerViewAdapter, в котором я настроил адаптер FirebaseRecyclerView для запроса ссылки users/userID/chats, а затем я установил ValueEventsListener для каждого чата с ключом, который адаптер находит:

FirebaseRecyclerAdapter<Boolean, ChatViewHolder> adapter = new
            FirebaseRecyclerAdapter<Boolean, ChatViewHolder>(
                    Boolean.class,
                    R.layout.chat_list_item,
                    ChatViewHolder.class,
                    mUserRef.child(mUserID).child("chats")){

                @Override
                protected void populateViewHolder(final ChatViewHolder viewHolder, Boolean model, final int position) {
                    final String key = this.getRef(position).getKey();
                    mChatRef.child(key).addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            Chat chat = dataSnapshot.getValue(Chat.class);
                            viewHolder.bindTo(chat);
                            viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View view) {
                                    Intent chatIntent = new Intent(ChatActivity.this, MessageActivity.class);
                                    chatIntent.putExtra("chatID", key);
                                    startActivity(chatIntent);
                                }
                            });

                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });
                }
            };

Это работает, но я боюсь последствий для производительности, поскольку я добавляю новый слушатель к каждому элементу независимо, а не ChildEventListener к подмножеству из chat элементов.

Это лучший способ справиться с этим? Заранее спасибо за помощь.


person Nikita Gamolsky    schedule 05.09.2016    source источник
comment
Запуск отдельного запроса для каждого элемента не является большой проблемой производительности в Firebase, поскольку клиент передает запросы по конвейеру. См. 35932786" title="ускорить получение сообщений для моего приложения социальной сети, используя запрос вместо obse">stackoverflow.com/questions/35931526/. Но вам придется где-то также отключить эти слушатели (мы используем addSingleValueEventListener()).   -  person Frank van Puffelen    schedule 05.09.2016
comment
Потрясающе спасибо! Таким образом, вы получите все чаты, в которых участвует определенный пользователь? Это похоже на неправильное использование FirebaseRecyclerViewAdapter, поскольку использование логического значения в качестве модели кажется немного странным.   -  person Nikita Gamolsky    schedule 21.09.2016