如何更新Firebase实时数据库

时间:2018-03-29 13:20:28

标签: ios firebase firebase-realtime-database nosql

我环顾四周并尝试了不同的查询,但似乎都没有。

我有一个社交网络iOS应用程序。当我更改用户的个人资料图片时,我需要此特定用户发布的所有帖子,以便更新并显示新的个人资料图片。我有这个当前用户的userId。

似乎唯一的方法是查询此用户发布的所有帖子,然后循环遍历它们并更新图片网址。但我不确定如何执行此查询。

这就是数据库的posts节点的样子。

posts

    post1ID (e.g. -TaldfjWEFa92SASnKN)
           name: ”Jack Johnson”
           profileImageUrl: ”https://firebasestorage.googleapis.com/….”
           userId: "UekUSYobEKZYO9WqXJQu2"
    -asjfka1ADFAJ23klja=
           name: "Karin Bold"
           profileImageUrl: ”https://firebasestorage.googleapis.com/….”
           userId: "YobEKZYIUxqXJQu2dl2AD"

相关代码:

if let imgData = UIImageJPEGRepresentation(img, 0.1) {
    let imgUid = NSUUID().uuidString
    let metadata = StorageMetadata()
    let imagesRef = DataService.instance.imagesStorageRef.child(imgUid)

    imagesRef.putData(imgData, metadata: metadata, completion: { (metadata, error) in
        if error != nil {
          //show alert
        } else {
            let downloadURL = metadata?.downloadURL()?.absoluteString
            if let url = downloadURL {
                changeRequest?.photoURL = URL(string: url)
                changeRequest?.commitChanges() { (error) in
                    if error == nil {

                        //get all the posts created by this user id
                        //update profile image url in all of them

                        self.userImageUrlRef = DataHandler.instance.postsRef.child("userId").queryOrdered(byChild: AuthHandler.instance.currentUserId).ref //child(AuthHandler.instance.currentUserId).child("profileImgUrl")
                        self.userImageUrlRef.updateChildValues(["profileImageUrl" : url])
                    } else {
                     //show alert
                    }

                }
            }
        }
    })
}

1 个答案:

答案 0 :(得分:0)

您分享的相关代码是:

DataHandler.instance.postsRef
  .child("userId")
  .queryOrdered(byChild: AuthHandler.instance.currentUserId)
  .ref 

这真的是一种非常有创意的方式。您需要将其更改为在您需要的字段上排序的查询,然后使用您需要的值进行过滤。所以:

let query = DataHandler.instance.postsRef
  .queryOrdered(byChild: "userId")
  .queryEqual(toValue: AuthHandler.instance.currentUserId)

然后将侦听器附加到该查询,您应该获取当前用户的帖子。要更新它们,请循环显示结果并依次更新每个结果:

ref.observeSingleEvent(of: .value, with: { (snapshot) in 
  let childUpdates = ["profileImageUrl": url]
  for child in snapshot.children.allObjects as [FIRDataSnapshot] {
    child.ref.updateChildValues(childUpdates, withCompletionBlock: { (error, ref) in 
    }) 
  }
})

请注意,如果您始终关注始终显示正确的配置文件信息,则应考虑不在每个帖子中存储该信息,而是仅将其存储在/users/$uid/profileImageUrl节点中。

另请参阅How to write denormalized data in Firebase上的答案。