Как хранить данные в Firestore (Swift) - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть приложение для iOS, использующее Cloud Firestore, и у меня проблемы с обновлением данных. Моя цель - добавить URL в словарь один за другим, но все, что я получаю, это переписать одно значение. Как я должен использовать setData и updateData? Пробовал по-разному

storageRef.child("users/" + currentUser.value!.documentID + "/" + faceRef.documentID + ".jpg")
          .putData(data!).observe(.success) { (snapshot) in

        guard let downloadURL = snapshot.metadata?.downloadURL()?.absoluteString else { return }
        let db = self.fsReference.document(self.currentUser.value!.documentID)
        var dict = ["faces": ["": ""]]
        dict["faces"] = ["newvalue\(downloadURL.hashValue)": downloadURL]

        db.updateData(dict)
        completion?()

Вот что я попробовал. Любой совет был бы неплох, спасибо заранее!

UPD: Пытался переместить мой словарь в подколлекцию, но после .collection("newCollection").document("newdocument") коллекция не появляется. В чем может быть проблема?

1 Ответ

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

Итак, я вижу, что вы используете облачное хранилище для сохранения изображений профиля и хотите сохранить каждый из URL-адресов этих изображений. Вы должны понимать, что и setValue () и updateValue () делают примерно одно и то же. Примечание с updateValue () - он создаст этот документ, если он еще не существует. Таким образом, при обновлении значений в Firestore следует понимать, что оно устанавливает значение в соответствии с тем, что вы ему даете, что поначалу может вводить в заблуждение.

1-й. При обновлении любого документа начните с получения документа первым. Если люди постоянно обновляют разные документы, вы можете рассмотреть возможность использования транзакций Firestore: https://firebase.google.com/docs/firestore/manage-data/transactions#transactions Это обеспечит правильное обновление ваших данных.

2-й Добавить URL к массиву, я не такой, как вы его настраиваете, но я бы настроил firestore, чтобы он выглядел примерно так

"users" = [
    "unique_id = "{
        "firstname": "John",
        "lastname": "Doe",
        "unique_id": "document_id_here"
        "faces": [ {key: value} ]
    }
]

Когда вы сериализуете этот объект, ваш объект лица должен быть таким [[String: Any]]

3-й, последний шаг - получить документ и обновить только это значение

// Get the value in the completion with the data use this code
// Drill down to the property you want to update using the completion data ex.
var faces = completedData.faces
faces.append("[key: value]") 


// Update the data back to firestore

let path = Firestore.firestore().collection("users").document("unique_user_id")

// Merging is so important. otherwise it will override your document 
path.setData(["facesKey: faces"], merge: true) {(error in
   if let error = error {
      // good error handling here
    }

    // Successfully updated document 

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