【问题标题】:Insert error when trying to save to core data尝试保存到核心数据时插入错误
【发布时间】:2015-06-23 17:33:51
【问题描述】:

我在第一次成功保存前一个对象后再次尝试将新对象保存到 Core Data 时遇到问题。

两个相关实体是儿童和护理:

class Child:NSManagedObject {
    @NSManaged var avatar:NSData!
    @NSManaged var birthdate:NSDate!
    @NSManaged var datecreated:NSDate!
    @NSManaged var datemodified:NSDate!
    @NSManaged var bloodtype:NSString!
    @NSManaged var eyecolor:String
    @NSManaged var firstname:String!
    @NSManaged var gender:String!
    @NSManaged var haircolor:String!
    @NSManaged var baths:NSSet!
}

class Nursing : NSManagedObject {

    @NSManaged var leftduration: Double
    @NSManaged var leftstarttime: NSDate?
    @NSManaged var mood: String
    @NSManaged var note: String
    @NSManaged var rightduration: Double
    @NSManaged var rightstarttime: NSDate?
    @NSManaged var spitup: Bool
    @NSManaged var child: Child
    @NSManaged var completed: Bool
    @NSManaged var leftstate: String
    @NSManaged var rightstate: String

}

Child 和 Nursing 之间存在一对多的关系: 儿童>护理

这是创建新记录并将其保存到 Core Data 的函数:

func createNewNursingRecordWithSide(side: String) {
        let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        var managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
        var nursing: AnyObject! = NSEntityDescription.insertNewObjectForEntityForName("Nursing", inManagedObjectContext: managedObjectContext!)

        //println("currentChild: \(currentChild?.description)")

        nursing.setValue(currentChild!, forKey: "child")
        if side == "left" {
            nursing.setValue(NSDate(), forKey: "leftstarttime")
            nursing.setValue("active", forKey: "leftstate")
        }else{
            nursing.setValue(NSDate(), forKey: "rightstarttime")
            nursing.setValue("active", forKey: "rightstate")
        }

        println("nursing: \(nursing.description)")
        var error:NSError?
        if managedObjectContext!.save(&error) != true {
            println("insert error: \(error!)")
            return
        }else{
            activeNursing = (nursing as! Nursing)
        }

    }

当我第一次调用这个函数时,它成功保存了一条记录,但是如果我第二次调用它,我得到以下错误:

insert error: Error Domain=NSCocoaErrorDomain Code=1570 "The operation couldn’t be completed. (Cocoa error 1570.)" UserInfo=0x17026e940 {NSValidationErrorKey=child, NSLocalizedDescription=The operation couldn’t be completed. (Cocoa error 1570.), NSValidationErrorObject=<Baby_Master.Nursing: 0x1740ce310> (entity: Nursing; id: 0xd000000000080002 <x-coredata://29485885-9E6E-4BCA-8B4C-1617F191B7BC/Nursing/p2> ; data: {
    child = nil;
    completed = 1;
    leftduration = 0;
    leftstarttime = "2015-06-23 15:51:27 +0000";
    leftstate = ready;
    mood = nil;
    note = nil;
    rightduration = 0;
    rightstarttime = "2015-06-23 15:51:03 +0000";
    rightstate = ready;
    spitup = 0;
})}

奇怪的是,试图保存的数据不是我传递给新的“护理”变量的数据,而是之前保存的记录数据。

当我打印新的护理 var 数据时,我得到:

nursing: <Baby_Master.Nursing: 0x1740cdeb0> (entity: Nursing; id: 0x174226560 <x-coredata:///Nursing/t3C52AE5B-96E0-48F4-BF92-6185B00E2CC12> ; data: {
    child = "0xd000000000080000 <x-coredata://29485885-9E6E-4BCA-8B4C-1617F191B7BC/Child/p2>";
    completed = 0;
    leftduration = 0;
    leftstarttime = nil;
    leftstate = ready;
    mood = nil;
    note = nil;
    rightduration = 0;
    rightstarttime = "2015-06-23 17:11:54 +0000";
    rightstate = active;
    spitup = 0;
})

您可以看到我尝试保存的“护理”变量包含对“子”数据的引用,这不是可选的,也是我收到错误的原因。

我的问题是,为什么不使用新数据而不是旧数据的新“护理”变量?

感谢您的帮助!

【问题讨论】:

    标签: swift core-data


    【解决方案1】:

    自然,问题归结为我的一个简单疏忽。原来我错过了@NSManaged var护理:NSSet!在我的 Child 模型类中。

    呃!

    固定模型为:

    class Child:NSManagedObject {
        @NSManaged var avatar:NSData!
        @NSManaged var birthdate:NSDate!
        @NSManaged var datecreated:NSDate!
        @NSManaged var datemodified:NSDate!
        @NSManaged var bloodtype:NSString!
        @NSManaged var eyecolor:String
        @NSManaged var firstname:String!
        @NSManaged var gender:String!
        @NSManaged var haircolor:String!
        @NSManaged var baths:NSSet!
        @NSManaged var nursings: NSSet!
        @NSManaged var diapers: NSSet!
    }
    

    希望这对遇到此问题的其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-17
      • 2011-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多