Сохранение снимка Firebase в качестве переменной для использования в других местах - PullRequest
0 голосов
/ 26 апреля 2019

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

Я пытался получить доступ к данным напрямую, используя:

let name = Database.database().reference().child("Users").child(userId!).child("Name")

Но это возвращает только каталог

Вот что я пытаюсь сделать:

@IBAction func checkInTapped(_ sender: Any) {

        attendance.text = "Present"

        guard !checkInClicked else {
            UIAlertController.showAlert(message: "ERROR: You can only check in once for this Module!", vc: self)
            return
        }

        let userId = Auth.auth().currentUser?.uid
        let userEmail = Auth.auth().currentUser?.email
        let moduleName = labelText
        let name = Database.database().reference().child("Users").child(userId!).child("Name")
        let currentDate = Date.getCurrentDate()
        let currentTime = Date.getCurrentTime()
        let presence = attendance.text
        let ref = Database.database().reference().child("Attendance").child("Checkin").child(moduleName).child(currentDate).child(userId!)
        let values = ["Email": userEmail!, "Check in Time": currentTime, "Attendance":presence] as [String : Any]
        ref.setValue(values)
        UIAlertController.showAlert(message: "You have checked in!", vc: self)
        checkIn.isEnabled = false
        checkOut.isEnabled = true
    }

Я пытаюсь сохранить все пользовательские данные при нажатии кнопки в базе данных, но также пытаюсь извлечь «Имя» из базы данных, чтобы сохранить его в переменной и присвоить его «значениям». Я все еще новичок в Свифте, поэтому любая помощь будет очень признательна

1 Ответ

0 голосов
/ 26 апреля 2019

На самом деле вы не получаете никаких данных из firebase, когда объявляете let name = Database.database().reference().child("Users").child(userId!).child("Name"), вы просто создаете ссылку на нее и не используете ссылку для каких-либо действий. Не видя структуру вашей базы данных, я не могу быть уверен, что этот код будет работать для вас, но попробуйте вместо этого:

            @IBAction func checkInTapped(_ sender: Any) {
            attendance.text = "Present"

            guard !checkInClicked else {
                UIAlertController.showAlert(message: "ERROR: You can only check in once for this Module!", vc: self)
                return
            }

            //use guard let with optional values to prevent app crashing if value is nil
            guard
            let userId = Auth.auth().currentUser?.uid,
            let userEmail = Auth.auth().currentUser?.email
                else {
                    print("guard let failed: userID, userEmail")
                    return
            }
            let moduleName = labelText
            let nameRef = Database.database().reference().child("Users").child(userId).child("Name")


                // now we need to retrieve data from nameRef       
     nameRef.observeSingleEvent(of: .value, with: { (nameSnap) in
                if let name = nameSnap.value{
                //name has successfully been retrieved from database and safely unwrapped, do whatever you like with it now

                    let currentDate = Date.getCurrentDate()
                    let currentTime = Date.getCurrentTime()
                    let presence = attendance.text
                    let ref = Database.database().reference().child("Attendance").child("Checkin").child(moduleName).child(currentDate).child(userId)
                    let values = ["Email" : userEmail, "Check in Time" : currentTime, "Attendance" : presence] as [String : Any]
                    ref.setValue(values) {
                        (error:Error?, ref:DatabaseReference) in
                        if let error = error {
                            print("Data could not be saved: \(error).")
                        } else {
                            print("Data saved successfully!")

                    UIAlertController.showAlert(message: "You have checked in!", vc: self)
                    checkIn.isEnabled = false
                    checkOut.isEnabled = true
                        }
                    }

                }
            }) { (Error) in
                print("unable to retrieve name from nameRef")
            }
        }

Несколько заметок:

  • name теперь успешно извлечено и безопасно развернуто, но в данный момент код ничего не делает с этим после этой точки

    • попробуйте безопасно развернуть необязательные значения, такие как userID и userEmail, вместо принудительного их применения, чтобы предотвратить сбои приложения из-за принудительного задания нулевых значений.

    • Я также добавил завершение / обработку ошибок для обеих выполняемых функций firebase, которые вы можете найти в документации Firebase: https://firebase.google.com/docs/database/ios/read-and-write

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...