Firebase Firestore数据调用异常:获取全部用户数据而非当前登录用户数据
问题根源
你的代码之所以会拉取所有用户名称,核心问题有两个:
- 你直接访问了
users集合下名为names的文档,从数据库结构来看,这个文档里存储的是所有用户的名称键值对,所以自然会拿到全部用户数据。 - 没有关联当前登录用户的唯一标识(UID),无法定位到当前用户对应的专属文档。
修复方案
Firebase的常规做法是用用户登录后的UID作为users集合下的文档ID,这样可以精准定位到单个用户的数据。修复步骤如下:
- 获取当前登录用户的UID:通过
Auth.auth().currentUser?.uid获取,同时要处理用户未登录的边界情况。 - 用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
相关产品推荐
相关产品推荐

