当前位置: 首页 > 知识库问答 >
问题:

Firebase直接子级与嵌套子级更改事件

越福
2023-03-14

在Firebase Structure Your Data一节中,有一个关于以下示例的讨论,其中聊天消息存储在聊天会话ID下。

如何监听onChildAdded进行任何对话?在消息上设置onchildupdate将发送包含所有会话的DataSnapshot。如果有大量的记录,那将是不可行的。查找整个快照中的哪个子级实际上被更新是一件很困难的事情。

如果我选择直接将消息存储在messages下,而每个消息都包含conversationid字段以检查其所属位置。通过在ConversationID上创建Indexon,我可以通过为消息设置值侦听器来监视添加或更新的每个子级。但是我认为对于一个非常大的数据库可能会有性能问题。

需要更新任何子项是因为我需要为消息的统计数据做一些计算。

{
  // 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个答案

廉学潞
2023-03-14

我认为您不需要为所有聊天节点注册监听器{一个,两个,三个,等等}。如果你听父节点来听所有的孩子,一个,两个,三个等等,效果会更好。

假设你的第一个屏幕是一个聊天室的列表,其中包含基本信息,如标题,最后一条消息,时间戳。最好为/chats/node注册一个子事件侦听器。这样你就可以得到所有聊天项目的列表。当用户单击聊天项目时,例如/chats/one/,为/messages/one/和/members/one/node注册一个子事件侦听器,用于属于该聊天的成员。

 类似资料:
  • 我正在尝试制作一个很好的ApiWrapper组件来填充各种子组件中的数据。从我读到的所有内容来看,这应该是可行的:https://jsfidle.net/vinniejames/m1mesp6z/1/ 但由于某种原因,当父状态更改时,子组件似乎没有更新。 我是不是漏了什么?

  • 问题内容: 在Firebase的数据库中,我需要更新open的值并将其传递给 所有子级的false。我如何用Java语言做到这一点?像这样 问题答案: Firebase数据库没有与SQL等效的数据库UPDATE messages SET open=false。 要更新Firebase中的节点,您必须首先具有对该特定节点的引用。为了获得对节点的引用,您必须知道该 节点的完整路径。 这意味着您首先需要

  • 我有一个名为的类,它有一个狗的列表: 狗类有一个小狗列表: 当我试图创建一个新的人类,它有一只狗,狗又有一只小狗,并且我使用带有spring的Hibernate JPA存储库来保存人类时: 我得到以下错误: 但是,如果我用默认值创建人类,并用人类存储库保存他,它就能工作,并且保存了小狗。 我不明白为什么小狗没有自动保存,我也不想使用一个单独的存储库来保存小狗。当狗定义时,Hibernate不应该自

  • 假设我有三个UI控制器(A、B、C)。 A是我的根控制器,在ShouldAutoRotate方法中我返回YES。我确实将ModalView从A介绍给B(B= 现在在C中,我可以将模拟器旋转到任何方向,整个视图都可以完美旋转。这就是问题所在,当C是横向的,而我将其忽略时,B中的所有对象都将变得一团糟!!同样的事情也发生在A身上。 我只需要在C上旋转!! 免费。

  • 我想做一些类似于下拉列表的事情,以便我的用户可以选择他们是想要gmail、hotmail还是outlook。然后,我希望按钮更新以显示他们的偏好。我必须只使用引导,因此不能使用 到目前为止,我已经尝试给他们所有相同的id,但是JS只使用了第一个,我不想给他们所有不同的id(太麻烦了)。所以我写的是使用子编号(类似于数组)并将值放入按钮。但是,我不知道如何找出当前html标记的位置号。请帮助我,提前

  • 问题内容: 我只是试图通过添加滚动视图来增加在此布局中滚动的能力,但是每次尝试加载布局时,我都会收到一条错误消息,指出“ java.lang.IllegalStateException:ScrollView只能容纳一个直接子代”,并且我不确定为什么。 任何建议,不胜感激。 资源: 编辑(响应CodeMagic的回答) 问题答案: 正如错误所言 将s 包裹在a 的内部,因此只有as作为直接子代。 来