我从文档中的“结构化数据”部分了解到,当您有双向关系时,非规范化数据对于实现更高效的查找非常有用。
在我的应用中,我有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
个项目的{{1}}。
这是处理此问题的最佳方法吗?在此先感谢您的帮助。