База данных 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):

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 при неявном развертывании необязательного значения», где «уровень» должен был быть прочитан с сервера.

Привет, я только что нашел это, похоже, нет? stackoverflow.com/questions/32170456/…

Itang Sanjana 08.06.2019 08:36
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
67
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

firebase rules

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

Мои правила базы данных кажутся хорошими; разрешено как чтение, так и запись.

user11616872 08.06.2019 05:46

Чтобы было ясно, когда вы регистрируетесь, вы видите свою зарегистрированную учетную запись на вкладке «Аутентификация»?

Marchal 08.06.2019 05:50

Да, пользователь записан на вкладке Аутентификация.

user11616872 08.06.2019 05:52

Попробуйте эту строку из документов firebase, я думаю, что у вас неправильный код записи self.ref.child("users").child(user.uid).setValue(["username"‌​: username])

Marchal 08.06.2019 06:00

Я пробовал это, но это для базы данных реального времени; Firestore, я считаю, отличается.

user11616872 08.06.2019 06:04
Ответ принят как подходящий

Я думаю, что проблема не в 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 ?? ""

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

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

Ошибка произошла в другом контроллере представления, я забыл упомянуть об этом ранее. Пожалуйста, смотрите обновленный вопрос; Извините за недопонимание!

user11616872 08.06.2019 09:55

Что такое reference? Вы использовали переменную uid при инициализации reference?

KeroppiMomo 08.06.2019 10:03
reference — это переменная, как показано в коде как var reference: DocumentReference!.
user11616872 08.06.2019 10:29
DocumentReference! называется неявно развернутый необязательный. Если вы не инициализируете reference, он останется nil. Он пытается развернуться в DocumentReference, но это nil, поэтому приложение вылетает.
KeroppiMomo 08.06.2019 10:35

Я изменил часть кода, и теперь он работает. Большое спасибо за Вашу помощь!

user11616872 08.06.2019 10:47

Другие вопросы по теме