2017-02-27 51 views
0

我想在名为“users”的子项中更新名为“PhotoGallery”的子值。更新Firebase中的子值

如何重写此代码才能这样做。

func registerDatabase(id: String, url: [String: AnyObject]) { 

     //Create a database reference 
     let userRef = self.databaseRef.child("users").childByAutoId().child(id) 

     userRef.updateChildValues(["PhotoGallery":url]) {(error, ref) in 

      if error != nil{ 
       print("Error registering Firebase database: \(error)") 

       return 
      } 

      print("Successfully stored in DB") 
     } 
    } 

    func removeSpecialCharsFromString(text: String) -> String { 
     let validChars: Set<Character> = Set("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ1234567890".characters) 

     return String(text.characters.filter{validChars.contains($0)}) 
    } 
+1

你*父母的孩子* node是用户,它有一个由childByAutoId创建的孩子,他有一个child * id *(一个字符串),然后他有一个孩子PhotoGallery,它是一个键值为字符串* url *的键。 – Jay

+0

您无法通过childByAutoId()更新子值。这将创建一个新的孩子。 – rv7284

+0

那么我该如何更新当前用户的这个特定孩子呢? –

回答

1

,因为你正在创建与childByAutoId飞的子节点的setValue将做到这一点。

let userChildRef = self.databaseRef.child("users").childByAutoId() 
let photoRef = userChildRef.child("id").child("PhotoGallery") 
photoRef.setValue(url) 

结果

users 
    -Yuhusn9asijasd 
     id 
     PhotoGallery: "www.someurl.com" 

注意到我离开photoRef作为一个单独的让利,以使其更具可读性,因为userChildRef现指所有用户

let nameRef = userChildRef.child("name") 
nameRef.setValue("Gilligan") 

let hatColorRef = userChildRef.child("hat") 
hatColorRef.setValue("White") 

let shirtColorRef = userChildRef.child("shirt") 
shirtColorRef.setValue("Red") 


users 
    -Yuhusn9asijasd 
     id: 
     PhotoGallery: "www.someurl.com" 
     name: "Gilligan" 
     hat: "White" 
     shirt: "Red" 
+0

谢谢,但不会更新当前用户的特定子项。它只会通过自动ID创建新孩子 –

+0

@CarstenHøvsgaard在您的问题中发布的代码使用childByAutoId,这意味着它不会因任何原因更新特定用户的子代。每次调用该函数时,都会创建一个新的子节点,因此不会有任何更新,因为新的子节点将为空。 – Jay

+0

感谢您的回答。 :-) –