首页 > 解决方案 > 如何使用 Firestore 获取请求获取特定字段数据?

问题描述

我已经在我的应用上成功设置了 Firebase Phone Auth。

在我的家中,当用户登录时,我检索他的特定 uid 以创建一个以他的 uid 命名的 firestore 文档,以添加有关用户的更多信息。我为每个用户添加了一个“积分”字段。

我正在尝试获取特定的“点”字段值。

这是我的 Firestore 的屏幕: 在此处输入图像描述

这是我的代码屏幕,其中包含打印到控制台的内容: 在此处输入图像描述

有人可以帮我解释一下解决方案吗?我已经知道我们不能仅通过 firestore get 请求获取字段值,但找不到存储“点”值以将其显示给我的用户的解决方案。

非常感谢。

如果需要,这是我的代码:

import SwiftUI
import Firebase

func getUID() -> String {
    let user = Auth.auth().currentUser
    if let user = user {
      return user.uid
    }
    return "Can't fetch user data."
}

struct HomeView: View {

    let uid = getUID()
    let db = Firestore.firestore()


    var body: some View {

        VStack {
            Text("User id = \(uid)")
                .font(.headline)
                .onAppear {
                    self.db.collection("users").document(self.uid).setData([
                        "points" : 2
                    ])
                }

            Button(action: {

                let docRef = self.db.collection("users").document(self.uid)

                docRef.getDocument { (document, error) in
                    if let document = document, document.exists {
                        let dataDescription = document.data()
                        print(dataDescription)
                    } else {
                        print("Document \(document) does not exist")
                    }
                }

            }) {
                Text("See my points")
            }

            Button(action: {
                try! Auth.auth().signOut()

                UserDefaults.standard.set(false, forKey: "status")

                NotificationCenter.default.post(name: NSNotification.Name(rawValue: "statusChange"), object: nil)
            }) {
                Text("Logout")
            }
        }

    }
}

struct HomeView_Previews: PreviewProvider {
    static var previews: some View {
        HomeView()
    }
}

标签: swiftfirebasegoogle-cloud-firestoreswiftui

解决方案


有两种方法可以访问 Firestore 文档中的特定字段:

  1. 该方法返回一个映射到data()的字典。您可以像这样读取属性:StringAny
let data = queryDocumentSnapshot.data()
let title = data["title"] as? String ?? ""
let author = data["author"] as? String ?? ""
let numberOfPages = data["pages"] as? Int ?? 0
  1. 您可以使用 Firestore 的 Codable 支持将文档映射到具有单线的 Swift 结构/类,如下所示:
let book = try? queryDocumentSnapshot.data(as: Book.self)

分别在此处此处阅读有关这些内容的更多信息。

我建议将任何数据访问代码提取到视图模型或商店中。我链接的文章展示了如何做到这一点。这将使您的代码更易于阅读、不易出错且更易于维护。


推荐阅读