【发布时间】:2016-10-09 12:56:33
【问题描述】:
我正在遵循 Firebase 的扁平化数据建议,但在列出我的数据库中的一系列项目时遇到了问题。
这是我的数据库文件的示例:
"users" : {
"UID12349USER" : {
"firstName" : "Jon",
"lastName" : "Snow",
"email" : "jonsnow@winterfell.com",
"albums" : {
"UID124ALBUM" : true,
"UID125ALBUM" : true
}
}
},
"albums" : {
"UID124ALBUM" : {
"name" : "My Artwork",
},
"UID125ALBUM" : {
"name" : "My Sketches",
}
}
我正在检索给定用户的专辑列表:
let userAlbums = database.child(usersKey).child(user.uid).child(albumsKey)
userAlbums.observeSingleEventOfType(.Value, withBlock: { snapshot in
// fetch [UID124ALBUM: 1, UID125ALBUM: 1]
})
现在我希望我可以在一个查询中检索所有用户的相册。 我可以做一批查询,并填充一个异步数组,但这对我来说似乎不是一个好方法......
for key in albumKeys {
let album = database.child(self.albumsKey).child(key)
album.observeSingleEventOfType(.Value, withBlock: { snapshot in
// fetch album.. append to array
})
}
由于请求的异步性质,使用这种方法很难检测查询何时完成。此外,由于连接不良,某些请求可能会失败。
此外,如果我想过滤具有给定名称(例如“我的作品”)的专辑之一,或者如果它不存在则返回 nil,我也会遇到一个棘手的结束条件。
var found = false
for key in albumKeys {
let album = database.child(self.albumsKey).child(key)
album.observeSingleEventOfType(.Value, withBlock: { snapshot in
// if current.name == "My Artwork"
// completion(current)
})
}
// This block will be called before observeSingleEventOfType =.=
if !found {
completion(nil)
}
我对 iOS 和 Swift 有很好的背景,但我熟悉 Firebase 和 NoSQL 数据库。有人能给我一个好的方向吗?我应该放弃 Firebase 并尝试其他方法吗?我是否缺少一些可以查询我需要的方法?我的 json 结构是否错误并缺少一些额外的键?
谢谢
【问题讨论】:
-
“此外,由于连接不良,某些请求可能会失败”所有请求都通过同一连接,该连接由 Firebase SDK 自动维护。有关这方面的更多信息,请参阅stackoverflow.com/questions/35931526/…
-
这很好,至少有一件事不是问题。尽管如此,这并没有改变必须有更好的方法来过滤数据的事实。鉴于 Firebase 的群聊示例,在指南中,一个用户可以是多个聊天室的一部分,一个聊天室可以有多个成员。如何获取(列出)给定用户的所有聊天室,因为您在用户对象中可以访问的只是聊天室 ID 列表?谢谢
-
您通常会在组和用户中保留索引。因此,对于每个组,您都会保留该组中的用户列表。对于每个用户,您都会保留他们所在组的列表。请参阅firebase.google.com/docs/database/ios/structure-data#fanout
-
@FrankvanPuffelen,是的,但是有了这些数据,您如何使用组 ID 列表执行查询?假设我是组 id1、id2、id3 的用户。如何使用此 ID 列表来获取实际的组信息(名称、日期等)。感谢您的帮助,我真的很困惑,如果您认为它更有效,您可以通过 guime84 与我联系
-
@FrankvanPuffelen,
fanoutvsloopthrough,如果您正在开发 Guilherme 描述的相同功能,您有什么建议?我对fanout中的数据重复不满意。
标签: ios swift firebase firebase-realtime-database