Из раздела "Структурирование данных" в документации я понял, что денормализация данных полезна для достижения более эффективного поиска, когда у вас есть двусторонние отношения.
В моем приложении у меня есть денормализованная структура данных для 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
элементов.
Это лучший способ справиться с этим? Заранее спасибо за помощь.
addSingleValueEventListener()
). - person Frank van Puffelen   schedule 05.09.2016