Firebase直接子项与嵌套子项更改的事件

时间:2016-07-09 16:01:16

标签: android firebase firebase-realtime-database

在Firebase 构建您的数据部分,有一个关于以下示例的讨论,其中聊天消息存储在聊天对话ID下。

在考虑此特定情况时,我们在one下进行了messages聊天,所有消息都存储在m1m2等其他消息中。

现在,当用户在主屏幕上时,它应列出所有对话,他/她是其中的一部分。在任何一个中,新消息到达UI将更新以显示新消息。但为此,我们需要将侦听器绑定到每个对话,例如:onChildAdded oneonChildAdded 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": { ... }
  }
}

1 个答案:

答案 0 :(得分:0)

我认为你不需要为所有聊天节点注册听众 {one,two,three,etc} 。如果你听父节点听所有孩子一,二,三等,那就更好了。

想象一下,您的第一个屏幕是聊天室列表,其中包含标题,上一条消息,时间戳等基本信息。如果为 / chats / 节点注册子事件侦听器,则会更好。因此,您可以获得所有聊天项的列表。当用户点击聊天项目,例如 / chats / one / 时,请为 / messages / one / / members / one /注册子事件监听器属于此聊天的成员的节点。