如何在Firestore(Swift)中存储数据

时间:2018-04-29 17:54:18

标签: swift firebase google-cloud-firestore

我有一个使用Cloud Firestore的iOS应用,但在更新数据方面存在问题。我的目标是逐个将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 :(得分:1)

所以我看到的是您正在使用云存储来保存个人资料图片,并且想要保存这些图片的每个网址。您需要了解 setValue() updateValue()都差不多。带有updateValue()的注释是它将创建该文档(如果尚不存在)。因此,在Firestore中更新值时,请了解它会将值设置为您提供的值,这一开始可能会引起误解。

1st在更新任何文档时,请先获取文档。如果人们不断更新其他文档,则您可能需要考虑使用Firestore交易:https://firebase.google.com/docs/firestore/manage-data/transactions#transactions 这将确保您的数据正确更新。

2nd将URL附加到数组的后面,我不是您设置它的方式,但是我将设置Firestore看起来像这样

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

序列化该对象时,您的面孔对象应为 [[String:Any]]

第三步,最后一步是获取文档并更新该值

// 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 

)}