【问题标题】:Get firebase message from sender and receiver从发送方和接收方获取 firebase 消息
【发布时间】:2019-12-09 19:24:41
【问题描述】:

我将 firebase 用于简单的聊天应用程序。我正在寻找用户 1 和用户 2 的消息。我的数据库结构如下所示。

我正在使用 queryOrdered 来获取消息,但它会根据发送者或接收者进行过滤。

 Database.database().reference().child("Chats").queryOrdered(byChild: "receiver")
                    .queryEqual(toValue: "2WCS7T8dzzNOdhEtsa8jnlbhrl12")
                    .observe(.value, with: { snapshot in

                    })

但使用此代码,我只收到了接收者的消息。我怎样才能收到发件人的消息。我可以使用 AND 条件来查询发件人孩子吗?

【问题讨论】:

    标签: ios swift firebase firebase-realtime-database


    【解决方案1】:

    在您当前的数据结构中,无法通过单个查询获取特定用户发送和接收的消息。


    Firebase 数据库查询只能对单个属性进行排序/过滤。在许多情况下,可以将要过滤的值组合成一个(合成)属性。

    例如,您可以将发送者和接收者 UID 组合成一个属性 "sender_receiver": "2WCS7T8dzzNOdhEtsa8jnlbhrl12_Sl91z....",然后查询该组合值。

    有关此方法和其他方法的更长示例,请在此处查看我的答案:Query based on multiple where clauses in Firebase


    但是,对于大多数聊天应用程序,我建议创建一个模拟聊天“房间” 的数据库结构。因此,与其拥有一长串所有消息,不如将消息存储在房间/线程中,这也是您在应用 UI 中显示的内容。

    "-RoomId1": {
      "msg1": { ... },
      "msg2": { ... }
    }, "-RoomId2": {
      "msg3": { ... },
      "msg4": { ... }
    }
    

    这样您就可以最直接地从数据库映射到您在屏幕上显示的内容。

    有关命名“房间”的好方法,请参阅Best way to manage Chat channels in Firebase

    然后,您仍然会为每个用户存储他们所属房间的映射,这也可能有助于确保访问权限。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-15
      • 2021-04-01
      • 2021-04-21
      • 2021-07-06
      • 2012-08-12
      • 2020-03-28
      • 2018-01-27
      • 2011-03-09
      相关资源
      最近更新 更多