【问题标题】:Firebase direct child vs nested child changed eventsFirebase 直接子级与嵌套子级更改事件
【发布时间】:2016-11-12 00:38:19
【问题描述】:

在 Firebase 结构化您的数据部分,讨论了以下示例,其中聊天消息存储在聊天对话 ID 下。

考虑到这种特殊情况,我们在messages 下聊天one,所有消息都存储在m1m2 等之下。

现在当用户在主屏幕上时,它应该列出所有对话,他/她是其中的一部分。在任何情况下,都会有新消息到达,UI 将更新以显示新消息。但为此,我们需要将侦听器绑定到每个对话,例如:onChildAdded for oneonChildAdded for two 等等。

如何收听onChildAdded 的任何对话?在messages 上设置onChildUpdate 将发送包含所有对话的DataSnapshot。如果有大量记录,那将是不可行的。查找整个快照的哪个子节点实际上已更新是一件很痛苦的事情。

如果我选择将消息直接存储在messages 下,而每条消息都包含conversationId 字段以检查其所属的位置。通过在conversationId 上创建indexOn,我可以通过为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": { ... }
  }
}

【问题讨论】:

  • 那么您找到解决问题的方法了吗?
  • @user2924714 Nop.. 当用户进入一个聊天时,我尝试检查和更新数据。如果用户退出聊天,则停止侦听该节点上的更改。没有别的了。

标签: android firebase firebase-realtime-database


【解决方案1】:

我认为您不需要为所有聊天节点{一、二、三等}注册侦听器。如果您听父节点来听所有子节点一、二、三等,那就更好了。

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

【讨论】:

  • 我知道我能做到。但我想为messages 中的所有消息设置一个侦听器。即使用户打开了聊天one,后台也应该有一个监听器来监听所有消息..
  • 如果您在开始消息活动时不终止活动,它将继续收听
  • 你应该删除listener 让它停止收听
  • 不是在活动打开时。例如,在任何消息对话中,无论对话如何,都会有消息到达。我可以在应用程序课上听。但是,我如何才能准确地让新孩子参与 Application 类的所有消息对话(无论活动如何,这都是聆听的好地方)。
  • 好的。据我了解,如果有属于任何对话的任何新消息,您想听。顺便说一句,对话和消息是相关的。如果没有对话,就没有消息。因此,无论对话如何,您都不能说出消息。但是,如果您要监听任何新消息,那么只需将子事件监听器注册到 /messages/ 节点。每当添加、删除、移动或更改消息时,都会触发一个事件。例如。想象一下,首先你没有消息,然后有 1 个消息到达,然后你会将它写入消息/一个节点,并且将触发 onChildAdded 事件。
猜你喜欢
  • 2020-03-17
  • 1970-01-01
  • 1970-01-01
  • 2018-08-04
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多