【问题标题】:How to get specific field data with Firestore get request?如何使用 Firestore 获取请求获取特定字段数据?
【发布时间】:2020-08-29 10:30:28
【问题描述】:

我的应用已成功设置 Firebase 电话身份验证。

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

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

这是我的 Firestore 的屏幕:

这是我的代码屏幕,其中包含打印到控制台的内容:

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

非常感谢。

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

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()
    }
}

【问题讨论】:

    标签: swift firebase google-cloud-firestore swiftui


    【解决方案1】:

    有两种方法可以访问 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)
    

    分别详细了解这些herehere

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

    【讨论】:

    • 我正在尝试学习您的课程here,但同一本书始终显示在列表中。正常吗?我按照教程一步一步来的。
    • 确保BookIdentifiable,并且每个图书实例都有一个唯一的id。在您链接到的教程部分中,这是通过在创建书籍时生成 UUID 来实现的。后续我们使用@DocumentID将Firestore文档ID映射到图书的id属性。
    • 他们有不同的 id,因为我直接在 Firebase 中创建了两本书。为了调试,我从教程中复制了您的所有代码,但问题仍然存在。我会重新开始的!
    猜你喜欢
    • 2019-05-28
    • 2020-03-29
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    相关资源
    最近更新 更多