我们如何将数据写入firebase实时数据库?即使启用了读/写,但似乎不起作用
Posted
技术标签:
【中文标题】我们如何将数据写入firebase实时数据库?即使启用了读/写,但似乎不起作用【英文标题】:How do we write data into firebase real time database? Even though read/write is enabled, just doesn't seem to work 【发布时间】:2019-07-13 09:15:19 【问题描述】:我创建了一个注册页面,其中包含用户的电子邮件、用户名、全名、密码和头像。问题是firebase身份验证工作完美,而且我成功地将个人资料图片上传到firebase存储。我似乎无法将全名和用户名等其他属性写入firebase实时数据库(不是firestore)。
读写已经设置为true: 身份验证成功 图像存储成功 数据写入实时数据库不工作
没有错误被抛出。只是没有数据被写入 使用 xcode 10.2.1
@objc func handleSignUp()
// properties
guard let email = emailTextField.text else return
guard let password = passwordTextField.text else return
guard let fullName = fullNameTextField.text else return
guard let username = usernameTextField.text?.lowercased() else return
Auth.auth().createUser(withEmail: email, password: password) (user, error) in
// handle error
if let error = error
print("Failed to create user with error: ", error.localizedDescription)
return
// set profile image
guard let profileImg = self.plusPhotoBtn.imageView?.image else return
// upload data
guard let uploadData = profileImg.jpegData(compressionQuality: 0.3) else return
// place image in firebase storage
let filename = NSUUID().uuidString
Storage.storage().reference().child("profile_images").child(filename).putData(uploadData)
Storage.storage().reference().child("profile_images/\(filename).jpg").downloadURL(completion: (url, error) in
guard let profileImageUrl = url?.absoluteString else return
guard let uid = Auth.auth().currentUser?.uid else return
let dictionaryValues = ["name": fullName,
"username": username,
"profileImageUrl": profileImageUrl]
let values = [uid: dictionaryValues]
Database.database().reference().child("users").updateChildValues(values, withCompletionBlock: (error, ref) in
guard let mainTabVC = UIApplication.shared.keyWindow?.rootViewController as? MainTabVC else return
// configure view controllers in maintabvc
mainTabVC.configureViewControllers()
// dismiss login controller
self.dismiss(animated: true, completion: nil)
)
)
【问题讨论】:
您一定遇到了错误,打印错误消息并编辑您的问题 确实如此。只是注意到我没有打印错误:) 【参考方案1】:您在代码中执行的顺序是问题的一部分。您应该真正使用 putData 之后的闭包来处理您放置的数据。
此外,当您创建用户时,闭包将包含一个用户变量,您可以从中获取 uid。所以不要这样做guard let uid = Auth.auth().currentUser?.uid
,因为用户变量保证是有效的。
这是一个可以使用的通用模板
Auth.auth().createUser(withEmail: email, password: password) (user, error) in
// handle error
if let error = error
print("Failed to create user with error: ", error.localizedDescription)
return
.
.
.
// Upload the file to the path "images/rivers.jpg"
let ref = storageRef.putData(data, metadata: nil) (metadata, error) in
guard let metadata = metadata else
print("error while uploading")
return
// Metadata contains file metadata such as size, content-type.
let size = metadata.size
storageRef.downloadURL (url, error) in
guard let downloadURL = url else
print("an error occured after uploading and then downloading")
return
let validDownloadUrl = downloadURL.absoluteString
let uid = user.uid
let dictionaryValues = ["name": fullName,
"username": username,
"profileImageUrl": validDownloadUrl]
//write out your firebase data with a key of uid
【讨论】:
工作就像一个魅力。也是快速更新。由于某种原因,我无法调用 user.uid。它仅在我使用 currentuser.uid 方法时才有效,否则我将不得不使用 user?.user.uid。不知道为什么 swift 需要两次提及用户。以上是关于我们如何将数据写入firebase实时数据库?即使启用了读/写,但似乎不起作用的主要内容,如果未能解决你的问题,请参考以下文章
将新数据添加到特定子项时如何使用 Cloud Functions 将数据写入 Firebase 实时数据库
无法使用 Swift 4 将数据写入 Firebase 实时数据库
如何获取当前的 Firebase UID 并将其写入实时数据库?