Firebase Swift childByAutoId()

根据Firebase文档 , childByAutoId应该在被调用时生成一个唯一的ID。

好的,但是我在这里使用它:

 let DeviceInfo = [ "ImageUrl":profileImageUrl!, "DeviceName":self.DeviceName.text!, "Description":self.Description.text!, "Category":self.itemSelected ] as [String : Any] self.ref.child("Devices").child(FIRAuth.auth()!.currentUser!.uid).observeSingleEvent(of: .value, with: {(snapShot) in if snapShot.exists(){ let numberOfDevicesAlreadyInTheDB = snapShot.childrenCount if numberOfDevicesAlreadyInTheDB < 3{ let newDevice = String("Device\(numberOfDevicesAlreadyInTheDB+1)") let userDeviceRef = self.ref.child("Devices").child(FIRAuth.auth()!.currentUser!.uid) userDeviceRef.observeSingleEvent(of: .value, with: {(userDevices) in if let userDeviceDict = userDevices.value as? NSMutableDictionary{ userDeviceDict.setObject(DeviceInfo,forKey: newDevice as! NSCopying) userDeviceRef.setValue(userDeviceDict) } }) } else{ let alert = UIAlertController(title: "Sorry", message:"You can only add three devices", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "Ok", style: .default) { _ in }) self.present(alert, animated: true){} } }else{ self.ref.child("Devices").child(FIRAuth.auth()!.currentUser!.uid).setValue(["Device1" : DeviceInfo]) self.ref.child("UserDevices").childByAutoId().setValue([ "ImageUrl":profileImageUrl!, "DeviceName":self.DeviceName.text!, "Description":self.Description.text!, "Category":self.itemSelected, "name": self.globalUserName, "email":self.globalEmail , "city": self.globalCity, "phone": self.globalPhone ] as [String : Any]) let alert = UIAlertController(title: "Great", message:"Device has beed added succssfully", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "Ok", style: .default) { _ in }) self.present(alert, animated: true){} } }) // } }) } 

这是将设备添加到Firebase的button的一部分。

如果设备less于3个,则用户可以添加( 否则在这里 ),否则,应该向用户显示警告(如果在此之前,则只能添加3个设备 )。

当我添加第一个设备时,上面的两个字典已添加到Firebase。 但第二次,当我试图添加第二个设备时,第一个字典已被添加,但不是第二个包含childByAutoId

这听起来很奇怪。 childByAutoId可以给每个注册用户一个ID吗?

我问为什么childByAutoId()第二次添加设备时没有生成自动ID?

它看起来像只有当“Devices”为空(即当snapShot.exists()返回false)时才调用childByAutoId() )。 一旦你填充“设备”,该行不会再被击中。