【问题标题】:Firestore database does not store dataFirestore 数据库不存储数据
【发布时间】:2019-10-23 11:39:39
【问题描述】:

我创建了一个应用,当用户注册时,应该在用户文档中的 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 ?? "")"
            }
        }
    }
}

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

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 分隔),主页将读取“级别”的值。但是,该应用程序因致命错误而崩溃:“致命错误:在隐式展开可选值时意外发现 nil”,其中“级别”应从服务器读取。

【问题讨论】:

标签: swift firebase google-cloud-firestore


【解决方案1】:

我认为问题不在于 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 ?? ""

这样,这三个变量在没有文本的情况下总是"",而你检查空白字段的逻辑仍然有效。

编辑:供将来参考,真正的问题不在于问题,而在于此答案的 cmets。

【讨论】:

  • 错误发生在另一个视图控制器中,我之前忘记提到了。请参阅更新的问题;造成误会请见谅!
  • 什么是reference?你在初始化reference时使用了变量uid吗?
  • reference 是一个变量,在代码中可以看到var reference: DocumentReference!
  • DocumentReference! 称为implicitly unwrapped optional。如果您不初始化reference,它将保持nil。它试图解开到DocumentReference,但它是nil,所以应用程序崩溃了。
  • 我已经更改了一些代码,现在可以使用了。非常感谢您的帮助!
【解决方案2】:

你检查你的数据库规则了吗? 你需要设置规则什么时候工作,什么时候不工作,这样除了你的应用程序之外没有人可以访问数据库 现在进行测试使用此代码来验证它是否正常,然后您应该更改它

{
  "rules": {
    ".read": true,
    ".write": true
  }
}

【讨论】:

  • 我的数据库规则看起来不错;允许读写。
  • 要清楚,当您注册时,您是否在“身份验证”选项卡中看到您的注册帐户?
  • 是的,用户记录在身份验证选项卡中。
  • 试试 firebase 文档中的这一行,我认为你写的代码是错误的self.ref.child("users").child(user.uid).setValue(["username": username])
  • 我试过了,但那是针对实时数据库的;我相信 Firestore 是不同的。
猜你喜欢
  • 2023-04-10
  • 2019-06-03
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
相关资源
最近更新 更多