代码之家  ›  专栏  ›  技术社区  ›  Jenny W

如何在Firebase实时数据库中更新特定用户发表的所有帖子中的特定字段

  •  0
  • Jenny W  · 技术社区  · 7 年前

    我环顾四周,尝试了不同的查询,但似乎都不起作用。

    我有一个社交网络iOS应用程序。当我更改用户的配置文件图像时,我需要此 特指的 用户还可以更新和显示新的配置文件图像。我有此当前用户的用户名。

    似乎唯一的方法是查询该用户发表的所有帖子,然后循环浏览并更新图像url。但我不确定如何执行此查询。

    这就是数据库的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 回复  |  直到 7 年前
        1
  •  0
  •   Frank van Puffelen    7 年前

    您共享的相关代码如下:

    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