iOS CoreData(SwiftUI)数据保存异常:键带引号且字段未入库
CoreData保存数据异常:键带引号且字段未存储问题
我在iOS开发中使用Swift+SwiftUI结合CoreData实现数据保存功能,编写了向Order实体保存数据的addOrder函数:
func addOrder(room: Room, userID: String, orderDetail: OrderDetail) { let order = Order(context: container.viewContext) order.id = UUID() order.name = orderDetail.name order.ownerID = room.ownerID order.tenant_id = userID order.tenant_ic = orderDetail.identityCard order.phoneNum = orderDetail.mobileNumber order.move_in_date = DateFormatter().string(from: orderDetail.moveInDate) order.created_at = Date() order.updated_at = Date() order.room_id = room.id!.uuidString print(order) save(context: container.viewContext) }
执行该函数后,打印Order实例得到如下输出:
<Order: 0x600000955450> (entity: Order; id: 0x600002aaec60 x-coredata:///Order/tD85A0123-DDC2-48FB-8414-F4F52913C8258; data: { "created_at" = "2022-09-11 13:26:18 +0000"; id = "458AF674-BE42-4266-8D3C-6BEA6B78FCAF"; "move_in_date" = ""; name = ""; ownerID = "A0051C62-4C91-4AF3-B42C-79FFD2B7275D"; phoneNum = ""; "room_id" = "FBAABEF2-7A58-4BE7-A01A-AA6DECB76767"; "tenant_ic" = ""; "tenant_id" = "F7176157-A432-4F0B-9767-BFC09D5AA756"; "updated_at" = "2022-09-11 13:26:18 +0000"; })
我发现room_id、tenant_ic等属性的键带有双引号,且这些对应属性的数据并未成功保存到数据库。以下是Order的数据模型代码:
import Foundation import CoreData extension Order { @nonobjc public class func fetchRequest() -> NSFetchRequest<Order> { return NSFetchRequest<Order>(entityName: "Order") } @NSManaged public var created_at: Date? @NSManaged public var id: UUID? @NSManaged public var move_in_date: String? @NSManaged public var name: String? @NSManaged public var ownerID: String? @NSManaged public var phoneNum: String? @NSManaged public var room_id: String? @NSManaged public var tenant_ic: String? @NSManaged public var tenant_id: String? @NSManaged public var updated_at: Date? } extension Order : Identifiable { }
问题原因及解决方法
1. 键带引号的原因
CoreData在打印实体数据时,会对包含下划线的属性名自动添加双引号,这只是CoreData的打印格式规则,本身不会影响数据的实际存储,无需过度关注。
2. 数据未保存的核心问题
从打印结果看,name、tenant_ic、move_in_date等字段值为空,主要是以下几个环节出了问题:
- 传入参数值为空:
orderDetail.name、orderDetail.identityCard、orderDetail.mobileNumber这些参数本身就是空值,先检查orderDetail的数据源是否正确赋值(比如用户输入是否为空、接口返回数据是否完整)。 - DateFormatter未配置格式:直接使用默认的
DateFormatter()转换日期,默认格式可能无法正确解析日期,导致返回空字符串。需要先配置Formatter的格式:let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd" // 根据需求设置合适的格式 order.move_in_date = dateFormatter.string(from: orderDetail.moveInDate) - 强制解包存在风险:
room.id!.uuidString使用了强制解包,如果room.id为空会直接崩溃,建议改用可选绑定或空合并运算符处理:order.room_id = room.id?.uuidString ?? ""
3. 额外检查项
- 确认
save函数的实现是否正确,确保上下文的变更被正确保存:func save(context: NSManagedObjectContext) { guard context.hasChanges else { return } do { try context.save() } catch { print("CoreData保存失败:\(error.localizedDescription)") } } - 检查CoreData模型文件(
.xcdatamodeld)中Order实体的属性配置:确保room_id、tenant_ic等属性存在,且类型与代码中的String?匹配,没有拼写错误。
内容的提问来源于stack exchange,提问作者林子翔
相关产品推荐
相关产品推荐

