单击“完成”,通过从NewVehicleViewController的IBAction方法中调用create + vehicle.m的方法创建一个新的NSEntityDescription。
Vehicle * car = [Vehicle vehicleWithName:name inManagedObjectContext:self.context];
此方法执行以下操作:
+ (Vehicle *) vehicleWithName:(NSString *)name inManagedObjectContext:(NSManagedObjectContext *) context
{
Vehicle *vehicle = nil;
//check for duplicates
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Vehicle"];
request.predicate = [NSPredicate predicateWithFormat:@"name = %@", name];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSError *error;
NSArray *matches = [context executeFetchRequest:request error:&error];
NSLog(@"Matches: %d", matches.count);
if(!matches || [matches count] >1){
//nil or more than 1
} else if ([matches count] == 0){
//not found
vehicle = [NSEntityDescription insertNewObjectForEntityForName:@"Vehicle" inManagedObjectContext:context];
vehicle.name = name;
}else{
vehicle = [matches lastObject];
NSLog(@"vehicle already exists with name: %@", name);
}
NSLog(@"Created vehicle with name: %@", vehicle.name);
return vehicle;
}
当窗口关闭,然后我返回到我的表视图控制器时,我可以在那里看到新元素。 (此表链接到fetch语句)。一切都很好。
然后大约4-6秒后,我抛出异常。底部的调试日志没有显示任何内容,它将我带到第一行中断的Thread 8视图。
libobjc.A.dylib`objc_exception_throw:
0x1780caa: pushl %ebp
0x1780cab: movl %esp, %ebp
0x1780cad: pushl %ebx
0x1780cae: pushl %edi
0x1780caf: pushl %esi
0x1780cb0: subl $2028, %esp
0x1780cb6: calll 0x01780cbb ; objc_exception_throw + 17
所以我的第一个问题是,知道问题是什么吗?这是因为NS Core Data的自动保存发生了一段时间后发生了吗?
我的第二个问题是,我怎么能进一步调试这个以找出问题所在?
谢谢!
答案 0 :(得分:0)
事实证明,我将模型中的实体从Car改为Vehicle。我通过代码传播了更改,但模拟器仍然保存了应用程序。应用程序内的数据库中仍然存有原始汽车,但现在它们被称为“车辆”。
这导致保存后发生异常。
我最终从模拟器中删除了应用程序,然后再次运行它,它运行了。
谢谢!