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

如何在Firestore Database中为指定UID的用户添加对应数据

修正后可直接运行的代码
import UIKit
import Firebase
import FirebaseAuth
import FirebaseFirestore

class NewBookViewController: UIViewController {

    @IBOutlet weak var bookTitleTextField: UITextField!
    @IBOutlet weak var bookAuthorTextField: UITextField!
    @IBOutlet weak var bookSummaryTextField: UITextField!
    
    @IBOutlet weak var ratingController: UIView!
    @IBOutlet weak var newBookCancelButton: UIButton!
    @IBOutlet weak var newBookSaveButton: UIButton!
    
    // 初始化Firestore实例
    let db = Firestore.firestore()
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    // 字段校验方法
    func validateFields() -> String? {
        if bookTitleTextField.text?.trimmingCharacters(in: .whitespacesAndNewlines) == "" ||
            bookAuthorTextField.text?.trimmingCharacters(in: .whitespacesAndNewlines) == "" ||
            bookSummaryTextField.text?.trimmingCharacters(in: .whitespacesAndNewlines) == "" {
            return "请填写所有字段"
        }
        return nil
    }

    // 保存按钮点击事件
    @IBAction func newBookSaveButtonTapped(_ sender: Any) {
        // 1. 先校验字段是否为空
        if let error = validateFields() {
            showAlert(title: "输入错误", message: error)
            return
        }
        
        // 2. 安全获取当前登录用户的uid
        guard let uid = Auth.auth().currentUser?.uid else {
            showAlert(title: "错误", message: "用户未登录,请先登录")
            return
        }
        
        // 3. 获取文本框输入的内容(已去空格换行)
        let bookTitle = bookTitleTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
        let bookAuthor = bookAuthorTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
        let bookSummary = bookSummaryTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
        
        // 4. 构造要写入的书籍数据
        let bookData: [String: Any] = [
            "bookTitle": bookTitle,
            "bookAuthor": bookAuthor,
            "bookSummary": bookSummary,
            "createTime": Timestamp(date: Date()) // 可选:添加创建时间方便后续排序
        ]
        
        // 5. 写入Firestore:路径为 users集合/当前用户uid文档/books子集合/自动生成书籍id的文档
        db.collection("users").document(uid).collection("books").addDocument(data: bookData) { error in
            if let error = error {
                self.showAlert(title: "保存失败", message: error.localizedDescription)
            } else {
                self.showAlert(title: "保存成功", message: "书籍信息已保存") {
                    // 保存成功后可执行关闭页面等操作
                    self.dismiss(animated: true)
                }
            }
        }
    }
    
    // 通用弹窗工具方法
    func showAlert(title: String, message: String, confirmHandler: (()->Void)? = nil) {
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "确定", style: .default, handler: { _ in
            confirmHandler?()
        }))
        present(alert, animated: true)
    }
    
    // 取消按钮点击事件
    @IBAction func newBookCancelButtonTapped(_ sender: Any) {
        dismiss(animated: true)
    }
}
核心修改说明
  • API适配:原代码混淆了Firebase Realtime Database和Cloud Firestore的API,Firestore没有child方法,采用collection("集合名").document("文档名")的格式定位数据位置,本次采用的存储路径users/[用户uid]/books/[书籍id]和你已有的用户注册数据结构对齐,适配多用户多书籍的存储需求
  • 逻辑顺序调整:将原写在点击事件内部、未调用也无返回值的post逻辑拆解为校验、取用户信息、取输入值、构造数据、写入的完整流程
  • 校验逻辑启用:点击保存先触发字段非空校验,避免空数据写入
  • 安全处理:对用户登录状态、文本框输入做可选值解包,避免运行时崩溃
  • 补充反馈逻辑:添加保存结果弹窗和成功后的页面跳转逻辑,优化用户体验
  • 可选扩展:新增了创建时间字段,方便后续查询时按时间排序展示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:45:03