在Firebase中检索值的正确方法

时间:2019-01-17 19:23:53

标签: ios swift firebase-realtime-database

我刚接触Firebase,正在阅读文档并尝试了几种解决方案。如何通过以下结构检索数据“ friendID”。每次加载此视图时,我只需检索一次该数据。

enter image description here

这是我最近的尝试。

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)
        }
    })
}

任何帮助都会很棒,在此先感谢!

3 个答案:

答案 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
  }
})