swift - Firestore 数据库不存储数据

标签 swift firebase google-cloud-firestore

我创建了一个应用程序,当用户注册时,应该在用户文档的 Firestore 服务器中创建两个值,即级别和主题(意味着它在/users/userid 中)。

我已尝试手动创建“用户”集合,但在用户注册时没有创建任何内容。

以下是我的代码(SignUpViewController):

import Firebase

var reference: DocumentReference!

func firebaseAuth() {
    let userDisplayName = textfieldDisplayName.text!
    let userEmail = textfieldEmail.text!
    let userPassword = textfieldPassword.text!

    if userEmail == "" || userPassword == "" {
        labelMessage.isHidden = false
        labelMessage.textColor = UIColor.red
        labelMessage.text = "Error: A compulsory field is left blank."
    } else {
        Auth.auth().createUser(withEmail: userEmail, password: userPassword) { (user, error) in
            if user != nil && error == nil {
                let changeRequest = Auth.auth().currentUser?.createProfileChangeRequest()
                changeRequest?.displayName = userDisplayName
                changeRequest?.commitChanges(completion: { (error) in
                    if error == nil {
                        let userID = Auth.auth().currentUser?.uid
                        let dataToSave: [String: Any] = ["level":0, "subjects":[""]]

                        self.reference = Firestore.firestore().collection("users").document(userID ?? "")
                        self.reference.setData(dataToSave, completion: { (error) in
                            if error == nil {
                                self.performSegue(withIdentifier: "presentInitial", sender: self)
                            } else {
                                self.labelMessage.isHidden = false
                                self.labelMessage.textColor = UIColor.red
                                self.labelMessage.text = "Error: \(error?.localizedDescription ?? "")"
                            }
                        })

                        self.performSegue(withIdentifier: "presentInitial", sender: self)
                    } else {
                        self.labelMessage.isHidden = false
                        self.labelMessage.textColor = UIColor.red
                        self.labelMessage.text = "Error: \(error?.localizedDescription ?? "")"
                    }
                })
            } else {
                self.labelMessage.isHidden = false
                self.labelMessage.textColor = UIColor.red
                self.labelMessage.text = "Error: \(error?.localizedDescription ?? "")"
            }
        }
    }
}

以下代码来自 SignUpViewController 重定向到 (HomeViewController) 的另一个 View Controller:

import Firebase

var reference: DocumentReference!

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
    let userID = Auth.auth().currentUser?.uid
    reference.getDocument { (docSnapshot, error) in // Fatal error occured here
        let data = docSnapshot?.data()
        let userLevel = data?["level"] as? String ?? ""

        if userLevel == "" {
            self.performSegue(withIdentifier: "performSetup", sender: self)
        }
    }
}

我预计当重定向到主页时(通过 presentInitial 进行搜索),主页将读取“level”的值。但是,该应用程序因 fatal error 而崩溃:“ fatal error :在隐式展开可选值时意外发现 nil”,其中“级别”本应从服务器读取。

最佳答案

我认为问题不在于 Firestore。根据错误信息,代码包装了一个可选值但失败,因为它是nil,所以问题可能出在这三行:

let userDisplayName = textfieldDisplayName.text!
let userEmail = textfieldEmail.text!
let userPassword = textfieldPassword.text!

有时,当 UITextField 没有文本时,它的 textnil 而不是 "",这可能会导致问题。您可以将这三行替换为以下内容:

let userDisplayName = textfieldDisplayName.text ?? ""
let userEmail = textfieldEmail.text ?? ""
let userPassword = textfieldPassword.text ?? ""

这样,当没有文本时,这三个变量将始终为"",您检查空白字段的逻辑仍然有效。

编辑:为了将来引用,真正的问题不在问题中,而在这个答案的评论中。

关于swift - Firestore 数据库不存储数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56503210/

相关文章:

ios - 以编程方式更改 imageview 高度 ios

ios - Firebase 将数据插入数据库三次而不是一次

android - 使用 Ionic 应用程序在 Android 上出现 Firebase 身份验证网络错误

java - 如何在自定义对象类中设置 @ServerTimestamp 注释 - Firestore

ios - 在 Swift 中采用 FIRGeoPoint 到 Codable 协议(protocol)

swift - 如何使用Cloud Firestore中的geopoint设置tableview以将商店放置在离我当前位置最近的位置?

ios - 检查两个对象在 Swift 中是否为 nil,ios xcode

ios - 在 ios 中使用 swift 重新声明 SocketIOManger 无效

java - 从 firebase android 中删除自动 key 节点

firebase - Firestore - 将文档添加到集合后如何获取文档 ID