Как добавить данные в существующий документ в базе данных Firestore - PullRequest
2 голосов
/ 20 июня 2020

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

    @IBAction func weiterButtonTapped(_ sender: Any) {
    let error = validateFields()
    
    if error != nil{
        //Fehler
        showError(error!)
    }else{
        //Daten aus Textfeld ziehen
        let aimedWeight = zielTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
        let height = groesseTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
        let weight = gewichtTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
        
        let user = Auth.auth().currentUser
        let db = Firestore.firestore()
        
        if user != nil{
            db.collection("Nutzer")
                .whereField("uid", isEqualTo: user!.uid)
                .getDocuments { (snap, err) in
                    if let err = err {
                        //error
                        print(err)
                    }else if snap!.documents.count != 1{
                        //error later on
                    }else{
                        //add data
                        var document = snap!.documents.first?.data()
            
                        document?.updateValue(height, forKey: "Größe")
                    
                        
                    }
                }
            
        }else{
            showError("Fehler")
        }
        toHomeScreen()
    }
}

Надеюсь, кто-то может помочь. Спасибо

Ответы [ 2 ]

0 голосов
/ 20 июня 2020

.set перезапишет существующий документ.

const docRef = firestoreDb.collection('Nutzer').doc(uid);
return docRef.set({
                    aimedWeight : _aimedWeight,
                    height : _height,
                    weight : _weight 
                    }).then(() => {
                    return {
                        success: true
                        };
                    });
0 голосов
/ 20 июня 2020

Сначала я предполагаю, что запись не завершена после перехода к следующему экрану. Если это действительно причина, вам нужно дождаться завершения записи перед вызовом toHomeScreen() аналогично тому, как вы уже ждете завершения getDocuments() перед записью.

@IBAction func weiterButtonTapped(_ sender: Any) {
let error = validateFields()

if error != nil{
    //Fehler
    showError(error!)
}else{
    //Daten aus Textfeld ziehen
    let aimedWeight = zielTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
    let height = groesseTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
    let weight = gewichtTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
    
    let user = Auth.auth().currentUser
    let db = Firestore.firestore()
    
    if user != nil{
        db.collection("Nutzer")
            .whereField("uid", isEqualTo: user!.uid)
            .getDocuments { (snap, err) in
                if let err = err {
                    //error
                    print(err)
                }else if snap!.documents.count != 1{
                    //error later on
                }else{
                    //add data
                    var document = snap!.documents.first?.data()
        
                    document?.updateValue(height, forKey: "Größe") { err in
                        if let err = err {
                            print("Error updating document: \(err)")
                        } else {
                            print("Document successfully updated")
                            toHomeScreen()
                        }
                    }                    
                    
                }
            }
        
    }else{
        showError("Fehler")
    }
}

Несвязанный: я бы также рекомендовал хранить данные пользователя под UID пользователя, а не под другим автоматически сгенерированным идентификатором. Уникальность идентификаторов UID также гарантируется, и их использование значительно упрощает этот код:

db.collection("Nutzer").document(user!.uid)?.updateValue(height, forKey: "Größe")...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...