Android Firebase - 使用FirebaseUI的非规范化查询

时间:2016-09-05 14:53:51

标签: android firebase firebase-realtime-database firebaseui

我从文档中的“结构化数据”部分了解到,当您有双向关系时,非规范化数据对于实现更高效的查找非常有用。

在我的应用中,我有chatsusers的非规范化数据结构:

{
  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) {

                        }
                    });
                }
            };

这样做有效,但我害怕性能影响,因为我在每个项目中独立添加一个新的监听器,而不是ChildEventListenerchat个项目的{{1}}。

这是处理此问题的最佳方法吗?在此先感谢您的帮助。

0 个答案:

没有答案