You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase Firestore数据调用异常:获取全部用户数据而非当前登录用户数据

问题根源

你的代码之所以会拉取所有用户名称,核心问题有两个:

  • 你直接访问了users集合下名为names的文档,从数据库结构来看,这个文档里存储的是所有用户的名称键值对,所以自然会拿到全部用户数据。
  • 没有关联当前登录用户的唯一标识(UID),无法定位到当前用户对应的专属文档。
修复方案

Firebase的常规做法是用用户登录后的UID作为users集合下的文档ID,这样可以精准定位到单个用户的数据。修复步骤如下:

  1. 获取当前登录用户的UID:通过Auth.auth().currentUser?.uid获取,同时要处理用户未登录的边界情况。
  2. 用UID定位用户文档:替换原来的document("names")为document(userUID),获取该用户文档中的name字段。
修改后的完整代码
import SwiftUI
import Firebase

struct AccountView: View {
    @State var name = ""
    @State private var isUserLoggedIn = true // 标记用户登录状态
    
    var body: some View {
        NavigationView {
            ZStack {
                if isUserLoggedIn {
                    VStack {
                        Text("Welcome \(name)")
                            .font(.title)
                        Button {
                            // 需提前定义update变量,比如@State private var update = false
                        } label: {
                            Text("Update My Info")
                        }
                        .buttonStyle(GradientButtonStyle())
                        .padding()
                    }
                } else {
                    Text("请先登录")
                        .font(.headline)
                }
            }
            .navigationTitle("Account")
            .onAppear(perform: downloadNameServerData)
        }
    }
    
    private func downloadNameServerData() {
        guard name.isEmpty else { return }
        
        // 获取当前登录用户UID
        guard let userUID = Auth.auth().currentUser?.uid else {
            print("用户未登录")
            isUserLoggedIn = false
            return
        }
        
        let db = Firestore.firestore()
        // 用UID定位当前用户的文档
        db.collection("users").document(userUID)
            .addSnapshotListener { documentSnapshot, error in
                guard let document = documentSnapshot else {
                    print("获取文档失败: \(error!)")
                    return
                }
                guard let userData = document.data(), let userName = userData["name"] as? String else {
                    print("文档数据为空或name字段不存在")
                    return
                }
                
                name = userName
                print("当前用户名称: \(name)")
            }
    }
}
额外说明
  • 确保Firestore数据库中,users集合下的文档ID是用户的UID,每个文档内包含name字段(对应用户名称)。
  • 处理用户未登录的情况,避免因currentUser为nil导致的崩溃。

内容的提问来源于stack exchange,提问作者user19620292

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 15:09:13