让我们说说我当前的结构Firebase实时数据库:
{
chatRooms:{
chat1:{
participants:{
user1-id:true,
user2-id:true
}
participantsCount:2,
lastTimeUpdated: {TIMESTAMP},
chatRoomName:"A chatroom",
maxParticipantsCount:10
}
}
users:{
user1-id:{
name:user1-name,
email:user1-email
}
user2-id:{
name:user2-name,
email:user2-email
}
}
}
我需要显示包含特定用户的所有聊天室及其所有信息,现在我的解决方案是:
#userId is currently authenticated, firebase user.
ref.child("chats").orderByChild("/participants/"+userId).equalTo(true)
返回包含等于$ true的$ userId的聊天列表,以及显示给用户的其他信息。有没有可能更改此查询AND / OR数据库结构以支持最佳索引的方法?如果我想添加索引,它将类似于:
chatrooms:{
participants:{
indexOn:"user1-id","user2-id"
# number of ids grows as participants increase
# Not only that, I will have to add one by one manually.
}
}
如何添加索引,同时在Android中进行查询,以显示用户所属的所有聊天室及其信息?
答案 0 :(得分:0)
AFAIK,我无法“遍历” Android中孩子的按键
要遍历Android中快照的子级,请执行以下操作:
for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
System.out.println(childSnapshot.getKey());
}
文档中的相关部分:https://firebase.google.com/docs/database/android/lists-of-data#listen_for_value_events
如果您要询问如何显示有关用户所在的每个聊天室的信息,将采用如下所示的客户端加入:
firebase.database().ref("userChatrooms").child(firebase.auth().currentUser.uid).once(function(roomsSnapshot) {
roomsSnapshot.forEach(function(roomKey) {
firebase.database().ref("chatrooms").child(roomKey.key).once(function(roomSnapshot) {
console.log(roomSnapshot.child("name").val());
})
})
})
从Firebase pipelines the nested requests开始,这种客户端加入的速度并没有大多数开发人员所期望的慢。