我刚接触Firebase,正在阅读文档并尝试了几种解决方案。如何通过以下结构检索数据“ friendID”。每次加载此视图时,我只需检索一次该数据。
这是我最近的尝试。
let profileDB = Database.database().reference().child("Profiles")
profileDB.child(userID!).child("friends").observeSingleEvent(of: .value, with: {
(snapshot) in
let dbValue = snapshot.value as? NSDictionary
if let friend = dbValue?["friendID"] {
print(friend)
}
})
更新:
如果我这样做:
let dbValue = snapshot.value as? NSDictionary
print(dbValue)
OR:
let dbValue = snapshot.value
print(dbValue)
然后我明白了,但不确定如何访问friendID
键。
Optional({
"-LWS8PMygzX2Lk-hOGvT" = {
friendID = qvhN5UMnbOWvfhhN4RAHtwjLuwG2;
};
"-LWS8PNFdUGMI1gHO8TF" = {
friendID = w3f7yLMdArUrnKLWR1nyE7ko1ds1;
};
})
如果我更改为此,那么它将起作用。但是上面的第一种观察方法对于一次检索不是更好吗?
profileDB.child(userID!).child("friends").observe(.childAdded) {
(snapshot) in
let dbValue = snapshot.value as! Dictionary<String,String>
if let friend = dbValue["friendID"] {
print(friend)
}
}
我的最后一个问题是,一旦我获取了此朋友ID,我如何加载他们的信息?我会在此观察者内部再次调用db吗?这似乎可行:
let profileDB = Database.database().reference().child("Profiles")
profileDB.child(userID!).child("friends").observe(.childAdded) {
(snapshot) in
let dbValue = snapshot.value as! Dictionary<String,String>
if let friendID = dbValue["friendID"] {
print(friendID)
let friendProfileDB = Database.database().reference().child("Profiles")
friendProfileDB.child(friendID).observeSingleEvent(of: .value, with: {
(snapshot) in
let friendDBValue = snapshot.value as? NSDictionary
if let name = friendDBValue?["name"] {
print(name)
}
})
}
任何帮助都会很棒,在此先感谢!
答案 0 :(得分:0)
看起来应该可以工作。您似乎对firebase键/值树节点结构有扎实的了解。如果数据库引用正确,则您应该能够通过每个键检查每个孩子,最终得出您的价值。
我会验证您的每个键都是正确的。
答案 1 :(得分:0)
看起来friends
是一个数组,因此直接检查friendID无效。也许尝试以NSArray的形式访问snapshot.value,然后循环浏览snapshot.value
中的项目,并检查其中是否有一个匹配的friendID。
答案 2 :(得分:0)
如果“朋友”节点的目的是存储朋友ID,则您希望将每个朋友ID作为键存储在“朋友”节点下。 结构如下:
friends
+ qvhN5UMnbOWvfhhN4RAHtwjLuwG2: 0
+ w3f7yLMdArUrnKLWR1nyE7ko1ds1: 0
+ otherFrienID: 0
现在,您可以像下面这样轻松地浏览字典(未经测试):
let profileDB = Database.database().reference().child("Profiles")
profileDB.child(userID!).child("friends").observeSingleEvent(of: .value, with: {
(snapshot) in
let dbValue = snapshot.value as? NSDictionary
var friendsIds = [String]()
for (key, value) in dbValue {
friendsIds.append(key)
//Here you can query firebase for the name corresponding to the friendId
}
})
然后,您可以请求Firebase提取与每个friendsIds
相对应的名称。
但是比这更好的是,您可以将friendsIds
与相应的名称一起保存,这样就不必进行其他查询。
在这种情况下,原始结构将如下所示:
friends
+ qvhN5UMnbOWvfhhN4RAHtwjLuwG2: "John Doe"
+ w3f7yLMdArUrnKLWR1nyE7ko1ds1: "Steve Jobs"
+ otherFrienID: "Peter Pan"
在Firebase中,为了轻松访问数据而进行数据冗余并不是犯罪,这被称为非规范化,并且是最佳实践的一部分。
然后,这是在单个查询中获取朋友姓名的方法:
let profileDB = Database.database().reference().child("Profiles")
profileDB.child(userID!).child("friends").observeSingleEvent(of: .value, with: {
(snapshot) in
let dbValue = snapshot.value as? NSDictionary
var friendsNames = [String]()
for (key, value) in dbValue {
friendsNames.append(value)
//No additional query here
}
})