【发布时间】: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;
})
您可以看到我尝试保存的“护理”变量包含对“子”数据的引用,这不是可选的,也是我收到错误的原因。
我的问题是,为什么不使用新数据而不是旧数据的新“护理”变量?
感谢您的帮助!
【问题讨论】: