我们如何将数据写入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 实时数据库

我们可以将数据插入 Firebase 实时数据库吗?

无法使用 Swift 4 将数据写入 Firebase 实时数据库

如何获取当前的 Firebase UID 并将其写入实时数据库?

如何使用 Java 将 Arraylist 数据写入 Firebase 数据库?

Firebase 实时数据库当前给出 TRIGGER_PAYLOAD_TOO_LARGE 错误