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

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,提问作者林子翔

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 16:20:42