根据Firebase Docs,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添加设备的按钮的一部分。
如果设备少于3个,则用户可以添加( else case here ),否则,应向用户显示警报(您只能添加3个设备 >)&#39;如果在此之前的情况下&#39;。
当我添加第一个设备时,上面的两个词典已添加到Firebase中。但第二次,当我尝试添加第二个设备时,添加了第一个字典,但没有添加第二个包含childByAutoId
的字典。
这对我来说听起来很奇怪。 childByAutoId
可以为每个注册用户提供一个ID吗?
答案 0 :(得分:0)
我问为什么childByAutoId()没有生成第二个自动ID 我添加了一个设备?
看起来你只是在&#34;设备&#34;时才调用SELECT E.Salary, M.*
FROM Employee E
inner join Mamanger M on E.ManagerId = M.Id and E.Salary > M.Salary
。为空(即childByAutoId()
返回false时)。一旦您填充了设备&#34;设备&#34;,该线路就不会再被击中。
答案 1 :(得分:0)
在添加第一台设备时,您将陷入else
的{{1}}状态,而在添加第二台和第三台设备时,您的snapShot.exists()
条件将snapShot.exists()
。因此,您还需要在条件块中添加第二个和第三个 UserDevices 条目。因此,您只需要更新以下几行代码:
true