我正在关注聊天应用的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。我需要做什么才能访问这些数据?
答案 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。