在Firebase 构建您的数据部分,有一个关于以下示例的讨论,其中聊天消息存储在聊天对话ID下。
在考虑此特定情况时,我们在one
下进行了messages
聊天,所有消息都存储在m1
,m2
等其他消息中。
现在,当用户在主屏幕上时,它应列出所有对话,他/她是其中的一部分。在任何一个中,新消息到达UI将更新以显示新消息。但为此,我们需要将侦听器绑定到每个对话,例如:onChildAdded
one
,onChildAdded
two
等等。
如何通过onChildAdded
收听任何对话?在onChildUpdate
上设置messages
会发送包含所有会话的DataSnapshot。如果有大量记录,这是不可行的。找到整个快照的哪个孩子实际更新是一件痛苦的事。
如果我选择直接在messages
下存储消息,而每封消息都包含conversationId
字段,以检查其所属位置。通过在indexOn
上创建conversationId
,我可以通过为messages
设置值监听器来关注每个添加或更新的子项。但是我认为可能存在一个非常大的数据库的性能问题。
更新任何孩子的需要是因为我需要对消息统计进行一些计算。
是否有可能实现这种情境?我需要密切关注每个对话的同步数据,无论用户在应用程序中的位置(在Application类中设置监听器可能是最好的选择)在其他地方更新多个值。
我所指的数据是:
{
// Chats contains only meta info about each conversation
// stored under the chats's unique ID
"chats": {
"one": {
"title": "Historical Tech Pioneers",
"lastMessage": "ghopper: Relay malfunction found. Cause: moth.",
"timestamp": 1459361875666
},
"two": { ... },
"three": { ... }
},
// Conversation members are easily accessible
// and stored by chat conversation ID
"members": {
// we'll talk about indices like this below
"one": {
"ghopper": true,
"alovelace": true,
"eclarke": true
},
"two": { ... },
"three": { ... }
},
// Messages are separate from data we may want to iterate quickly
// but still easily paginated and queried, and organized by chat
// conversation ID
"messages": {
"one": {
"m1": {
"name": "eclarke",
"message": "The relay seems to be malfunctioning.",
"timestamp": 1459361875337
},
"m2": { ... },
"m3": { ... }
},
"two": { ... },
"three": { ... }
}
}
答案 0 :(得分:0)
我认为你不需要为所有聊天节点注册听众 {one,two,three,etc} 。如果你听父节点听所有孩子一,二,三等,那就更好了。
想象一下,您的第一个屏幕是聊天室列表,其中包含标题,上一条消息,时间戳等基本信息。如果为 / chats / 节点注册子事件侦听器,则会更好。因此,您可以获得所有聊天项的列表。当用户点击聊天项目,例如 / chats / one / 时,请为 / messages / one / 和 / members / one /注册子事件监听器属于此聊天的成员的节点。