如何在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
相关产品推荐
相关产品推荐

