如何读取 Firestore (Swift) 中字段的值

Posted

技术标签:

【中文标题】如何读取 Firestore (Swift) 中字段的值【英文标题】:How can I read the value of a field in Firestore (Swift) 【发布时间】:2021-03-11 11:21:23 【问题描述】:

我想读出我的文档的字段值(在带有 SwiftUI 的 Firebase Firestore 中)。 我已经拥有的就是这个:

 let value = myDataBase
 // My Database instance
 //
 value.collection("My Collection").whereField("Code", isEqualTo: codeTextInput)
     .getDocuments()  (querySnapshot, err) in
         if let err = err 
             print("Error getting documents: \(err)")
          else 
             for document in querySnapshot!.documents 
                 print("\(document.documentID) => \(document.data())")
                                    
             
        
   

(此代码运行良好)

现在我想存储所有文档的值,这些文档在我的集合中,并且键“代码”具有键入的值。但我想存储键“Wert”的数据

保存后,我想将其用作用户默认值... 顺便提一句。我不想用这个代码收集超过 1 个项目,我只希望我收集的这个项目是正确的。

【问题讨论】:

你能详细说明一下(在你的问题中)你想对这些值做什么吗?你想聚合它们(例如总结它们),将它们显示在列表中,...? 完成了。我只想说:我不想收集多个值。 【参考方案1】:

总结一下:

    您希望获取集合中具有特定值的所有文档 您希望保存所有这些值并能够访问它们。

我只能建议在这种情况下使用objects。我们举个例子:

让我们导入所有模块

import Foundation
import Firebase
import FirebaseFirestoreSwift
import FirebaseStorage
import Combine

首先我们声明结构: https://firebase.google.com/docs/firestore/manage-data/add-data#custom_objects

public struct MyObject: Codable 

    let id: String
    let code: String?

    // Needed to identify them in Firestore
    enum CodingKeys: String, CodingKey 
        case id
        case code = "code"
    


现在我们访问它并为我们可以获取的每个包含所需值的文档生成一个对象: https://firebase.google.com/docs/firestore/query-data/get-data#custom_objects

var myArray: Array<MyObject> = [] // Empty array where we will store all objects in
var codeTextInput = "Test"

// Fetch only desired documents
let db = Firestore.firestore()
let docRef = db.collection("My Collection").whereField("Code", isEqualTo: codeTextInput)

func getDocumentsAsObjects()  // docRef.getDocuments Needs to be in function or else: Expressions are not allowed at the top level
    docRef.getDocuments  (querySnapshot, err) in //getDocuments (s) as in multiple 
        
        if let err = err 
            print("Error getting documents: \(err)")
         else 
            for document in querySnapshot!.documents  // iterate them and add them to your array
                let result = Result 
                    try document.data(as: MyObject.self)
                
                
                switch result 
                case .success(let myObject):
                    if let myObject = myObject 
                        myObject.id = document!.documentID // Get the ID of the Document as we might need it later
                        myArray.append(myObject) // Save the document into your array
                     else 
                        // A nil value was successfully initialized from the DocumentSnapshot,
                        // or the DocumentSnapshot was nil.
                        print("Document does not exist")
                    
                case .failure(let error):
                    // A `MyObject` value could not be initialized from the DocumentSnapshot.
                    print("Error decoding city: \(error)")
                
                
            
        
    


现在你的数组中有你的对象并且可以访问它们了

【讨论】:

当我这样做时,我收到错误:“Query”类型的值没有成员“getDocument” 你是对的。我没有检查它是否可以编译。我的回答不好。现已更正并为我编译。 只是一个简短的说明 - 由于您的所有字段名称都与文档中的名称匹配,因此无需使用 CodingKeys。您还应该使用@DocumentID 来映射文档 ID,这将使您摆脱打开文档 ID (myObject.id = document!.documentID) 的强制。 @Boothosh,这能回答你的问题吗? 是的,你是对的。我只是保留了示例中的 CodingKeys,因为我认为他的文档中将有不止 1 个值。

以上是关于如何读取 Firestore (Swift) 中字段的值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 上将具有自定义 ID 的文档添加到 Firebase (Firestore)

如何在 Swift 中使用 Firestore 为 2 人多人游戏构建数据?

如何从存储在 Firestore (Swift) 中的文档中返回对象

Firestore:查询和安全 (Swift)

如何使用swift在firestore文档中的字段中生成空值?

我如何获取 Firestore 数据库 iOS Swift 中对象键的值