在Firebase中构建聊天应用的数据

时间:2016-05-29 20:34:34

标签: swift firebase firebase-realtime-database

我正在关注聊天应用的structuring data Firebase指南。他们建议如下所示的结构。

{
  // 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
  // converation ID
  "messages": {
    "one": {
      "m1": {
        "name": "eclarke",
        "message": "The relay seems to be malfunctioning.",
        "timestamp": 1459361875337
      },
      "m2": { ... },
      "m3": { ... }
    },
    "two": { ... },
    "three": { ... }
  }
}

如何构建用户数据,以便我可以轻松显示他们所属的所有聊天列表,并为每个聊天显示最后一条消息和时间戳。如果我执行以下结构:

   "users": {
    "ghopper": {
      "name": "Gary Hopper",
      "chats": {
          "one: true",
          "two": true
      }
    },
    "alovelace" { ... }
  },

我可以轻松地获取特定用户的每个聊天组的列表,例如ghopper,通过执行(在swift中):

ref.child("users").child("ghopper").child("chats").observeSingleEventOfType(.Value, withBlock: { (snapshot) in
  //do something with data
}

但是我在这个快照中没有lastMessage和timestamp。我需要做什么才能访问这些数据?

  • 为每个用户复制所有这些数据?即添加用户/ ghopper / chats / one / {“lastMessage”:“ghopper:发现中继故障。原因:蛾。”,“时间戳”:1459361875666}
  • 针对用户所属的每个聊天(添加多个列表器)查询“聊天/ specificGroupId”?
  • 其他一些方式?

2 个答案:

答案 0 :(得分:17)

  

如何构建用户数据以便我可以轻松显示列表   他们所参与的所有聊天,每个聊天都显示出来   最后一条消息和时间戳。

通过添加聊天节点中的用户

来更改聊天结构
avr-gcc

然后你可以深入查询特定用户所参与的所有聊天 - 这将返回参与的聊天内容uid_3

avr-binutils

请注意,每个firebase用户在通过auth.uid创建用户时都会获得一个谨慎的用户ID。这应该(通常)用作每个用户的密钥。

答案 1 :(得分:2)

在您有一个用户所有聊天列表的块中,您可以这样做:

var dictionary: [String: Long]   
var lastMessage: String 
for chat in listOfChatsUserIsIn
    ref.child("chats").child("\(chat)").child("lastMessage").observeSingleEventOfType(.Value, withBlock: { (snapshot) in
        lastMessage = snapshot
        ref.child("chats").child("\(chat)").child("timestamp").observeSingleEventOfType(.Value, withBlock: { (snapshot) in
            //add timestamp and last message to dictionary
        }
    }

我不知道我的语法有多正确。还在学习firebase。但是,我认为这基本上是你的第二个建议。不知道你怎么会得到这些数据。这可能是O(2n)虽然也不错。

[[Update 1]]

我的代码很懒。我把lastMessage = snapshot保存起来,以便你可以将它添加到下一个块的字典中。

Firebase是异步的。我认为只要您使用时间戳或消息作为键而另一个作为字典中的值,这仍然有效。它可能不按顺序填充,但您可以随后按时间戳对其进行排序。虽然,是的,这可能不是最佳做法。

杰伊,我喜欢你的解决方案。你不必列出uid_2: false吗?

不幸的是,似乎这两个数据库结构都以n ^ 2增长为用户 - > inf和聊天 - > INF。