Swift开发:如何实现所有字段非空时才保存数据到Core Data
实现Core Data全字段校验后再保存的方案
你的原代码存在核心问题:即便有必填字段为空,最后依然会执行Core Data的保存操作,导致不完整的数据被存入数据库。要实现「所有字段填写完整才保存」,需要先统一完成所有必填项的合法性校验,只有全部通过后再执行实体创建、赋值和保存流程。
修改后的代码
let appDelegate = UIApplication.shared.delegate as! AppDelegate let context = appDelegate.persistentContainer.viewContext // 1. 依次校验所有必填字段,有任何一项不合法就终止流程 guard let forWhat = forWhatText.text, !forWhat.isEmpty else { makeAlert(titleInput: "错误", messageInput: "请填写用途!") return } guard let phoneName = phoneName.text, !phoneName.isEmpty else { makeAlert(titleInput: "错误", messageInput: "请填写设备名称!") return } guard let phoneNumberStr = phoneNumber.text, !phoneNumberStr.isEmpty, let phoneNumber = Int(phoneNumberStr) else { makeAlert(titleInput: "错误", messageInput: "请填写有效的手机号码!") return } guard let sosMessage = messageText.text, !sosMessage.isEmpty else { makeAlert(titleInput: "错误", messageInput: "请填写紧急消息内容!") return } guard let latitude = choosenLatitude, let longitude = choosenLongtitude else { makeAlert(titleInput: "错误", messageInput: "请在地图上选择你的紧急位置!") return } // 2. 所有校验通过后,创建实体并赋值 let newSOS = NSEntityDescription.insertNewObject(forEntityName: "SOS", into: context) newSOS.setValue(forWhat, forKey: "forWhat") newSOS.setValue(phoneName, forKey: "phoneName") newSOS.setValue(phoneNumber, forKey: "phoneNumber") newSOS.setValue(sosMessage, forKey: "sosMessage") newSOS.setValue(UUID(), forKey: "id") newSOS.setValue(latitude, forKey: "latitude") newSOS.setValue(longitude, forKey: "longtitude") // 3. 执行保存操作 do { try context.save() print("保存成功") } catch { print("保存失败:\(error.localizedDescription)") }
关键优化点
- 前置集中校验:用
guard语句依次检查每个必填项,一旦发现空值或格式错误,立即弹出提示并终止后续流程,从根源避免创建不完整的实体对象 - 优化用户体验:原代码会同时弹出多个错误提示,优化后只会弹出第一个不合法字段的提示,避免信息轰炸
- 安全类型转换:将手机号的字符串转Int操作整合到校验逻辑中,确保只有合法的数字格式才会进入保存流程
内容的提问来源于stack exchange,提问作者Yavuz Ulgar
相关产品推荐
相关产品推荐

