База данных Firestore не хранит данные - PullRequest
0 голосов
/ 08 июня 2019

Я создал приложение, в котором при регистрации пользователь должен создать на сервере Firestore в документе пользователя два значения: уровень и темы (то есть в /users/userid).

Я пытался вручную создать коллекцию 'users', но ничего не создается, когда пользователь регистрируется.

Ниже приведен мой код (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) домашняя страница будет читать значение 'level'.Тем не менее приложение завершилось с фатальной ошибкой: «Неустранимая ошибка: неожиданно обнаружил ноль при неявном развертывании необязательного значения», где «уровень» предназначался для чтения с сервера.

Ответы [ 2 ]

1 голос
/ 08 июня 2019

Я думаю, что проблема не с Firestore. Согласно сообщению об ошибке, код переносит необязательное значение, но не удалось, поскольку оно равно nil, поэтому проблема, вероятно, заключается в следующих трех строках:

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

Иногда, когда UITextField не имеет текста, его text равно nil вместо "", что может вызвать проблему. Вы можете заменить три строки следующим:

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

Таким образом, эти три переменные всегда будут "", когда нет текста, и ваша логика проверки пустых полей будет по-прежнему работать.

Редактировать: Для дальнейшего использования реальная проблема не в вопросе, а в комментариях к этому ответу.

0 голосов
/ 08 июня 2019

Проверяли ли вы правила своей базы данных?вам нужно настроить правила, когда работать, а когда нет, чтобы никто не мог получить доступ к базе данных, но ваши приложения для теста теперь используют этот код для проверки его работоспособности, тогда вы должны изменить его

firebase rules

{
  "rules": {
    ".read": true,
    ".write": true
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...