Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何使用Firestore get请求获取特定字段数据?_Swift_Firebase_Google Cloud Firestore_Swiftui - Fatal编程技术网

Swift 如何使用Firestore get请求获取特定字段数据?

Swift 如何使用Firestore get请求获取特定字段数据?,swift,firebase,google-cloud-firestore,swiftui,Swift,Firebase,Google Cloud Firestore,Swiftui,我已在我的应用程序上成功设置Firebase Phone Auth 在我家,当用户登录时,我检索他的特定uid以创建一个名为他的uid的firestore文档,以添加有关该用户的更多信息。 我为每个用户添加一个“点”字段 我正在尝试获取特定的“点”字段值 这是我的Firestore的屏幕: 这是我的代码屏幕,上面有打印到控制台的内容: 有人能帮我解释一下解决办法吗?我已经知道,我们无法通过firestore get请求仅获取字段值,但无法找到存储“points”值以向用户显示该值的解决方案

我已在我的应用程序上成功设置Firebase Phone Auth

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

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

这是我的Firestore的屏幕:

这是我的代码屏幕,上面有打印到控制台的内容:

有人能帮我解释一下解决办法吗?我已经知道,我们无法通过firestore get请求仅获取字段值,但无法找到存储“points”值以向用户显示该值的解决方案

非常感谢

如果需要,以下是我的代码:

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

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

  • data()。您可以这样读取属性:
  • let data=queryDocumentSnapshot.data()
    将title=数据[“title”]设为?一串""
    将author=数据[“author”]设为?一串""
    让numberOfPages=数据[“pages”]作为?Int??0
    
  • 您可以使用Firestore的可编码支持将文档映射到具有一行程序的Swift结构/类,如下所示:
  • let book=try?queryDocumentSnapshot.data(as:Book.self)
    
    分别阅读有关这些和的更多信息


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

    我正试图按照您的思路进行操作,但列表中始终显示相同的书籍。这正常吗?我循序渐进地学习了教程。请确保
    图书
    是可识别的,并且每个图书实例都有一个唯一的
    id
    。在链接到的教程部分中,这是通过在创建书籍时生成UUID来实现的。在后续操作中,我们使用
    @DocumentID
    将Firestore文档ID映射到该书的
    ID
    属性。它们具有不同的ID,因为我直接在Firebase中创建了两本书。为了调试,我复制了教程中的所有代码,问题仍然存在。我会重新开始!