代码之家  ›  专栏  ›  技术社区  ›  Dani iman kazemayni

Firebase数据库中的多用户聊天室数据结构

  •  1
  • Dani iman kazemayni  · 技术社区  · 7 年前

    我很难搞清楚如何构建多用户聊天室 FirebaseDatabase

    基本上,该应用程序支持用户之间的私人消息(可以是2个用户之间或多个用户之间)。如果只在两个用户之间,数据结构真的很简单。

    我试图降低成本(我不希望当前登录的用户正在与某人聊天,而观察者正在获取与此特定聊天无关的所有消息),并正确地构造数据。如果它只在2个用户之间,我总是可以在当前用户ID下添加recepient并只查询该节点。但对于多个用户(甚至不知道有多少),我需要依赖聊天室Id,但我很难做到这一点。

    enter image description here

    enter image description here

    我现在面临的问题是 chatId . 这是让我困惑的部分。我已经坚持了好几天了,我想不出一个合适的方法来维持这个 查蒂德 并正确查询。欢迎任何帮助。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Jay    7 年前

    如果我理解这个问题,这个应用程序有多个用户,这些用户可以有1-1或1-many聊天,你要避免用户获得他们不参与的聊天事件。

    让我们从用户节点开始

    users
      uid_0
        name: "Bill"
        chats:
          chat_id_0: true
          chat_id_9: true
      uid_1
        name: "Jesse"
        chats:
          chat_id_0: true
          chat_id_6: true
      .
      .
      .
    

    然后是一个简化的聊天节点

    chats
       chat_id_0:
         uid_0: "Hey there, Jesse"
         uid_1: "Sup Bill?"
       chat_id_6:
         uid_0: "This is Bill, anyone around?"
       chat_id_9:
         uid_1: "Look ma, no hands"
         uid_7: "Impressive"
    

    在上面的例子中,当用户开始聊天时,chat\u id\u x是用.childByAutoId创建的。

    比尔和杰西正在chat\u id\u 0中聊天,比尔正在等待任何同时观看chat\u id\u 6的用户的回复,杰西正在chat\u id\u 9中与uid\u 7对话。

    任何时候只要有一个事件(例如,当一条新消息被添加到聊天中时,添加了childAdded),只有那些观察该聊天的用户(“subscribed”)才会收到一个事件。

    显然,每个聊天节点都会包含更多的细节(时间戳等)

    如何检查是否已经有同一个收件人(或

    一种是,当一个观察者被添加到您所属的每个聊天中时(.childAdded),该聊天节点中的每个子节点都将返回到您的应用程序。这有两个好处-一是用现有的聊天信息填充UI,二是。。。你就会知道谁参与了那次谈话。将这些UID与chat id放在一个数组中,在向此人发送聊天之前,查看它们是否作为现有聊天存在于数组中。

    第二个选项是查询用户uid出现在其中的所有聊天记录(使用.observeSingleEvent进行查询)。它将返回他们所属的所有聊天节点,然后有他们聊天对象的uid和聊天id。

    chats
      chat_id_0
         who_dat
            uid_0: true
            uid_1: true
            uid_2: true
         messages:
            uid_0: "Hey there, Jesse"
            uid_1: "Sup Bill?"
    

    推荐文章