我希望有人可以帮助我调试令人难以置信的Core Data崩溃。我最初将数据加载到两个实体(代表“发言人”和“标题”),然后为“会话”加载第三个实体,并尝试将关系设置为“发言人”和“标题”。 (从会话到演讲者和标题是一对一的,从演讲者/标题到会话是一对多的)。我使用整数键来设置每个关系。难以调试iPhone核心数据错误
由于给定的发言人和标题可以指向多个会话,因此我编写了一个搜索适当的托管对象并返回该对象的函数。然后我为这种关系做了设定。
这对于演讲者关系很好,但对于第二个标题一致而且可怕地崩溃。我用不同的方式重写了这些代码几次,我总是会遇到同样的问题。无论第二个标题是什么,问题都存在。所以我必须做一些根本性错误的事情,但继续阅读更多iPhone 3开发中的核心数据章节,没有什么会跳出来。我希望有人可能会看到我错过的东西(并且一直持续几天)。 (最后一个注意:无论我将managedObjectContext保存在for循环还是外部,都会发生崩溃,并始终在第二个会话中)。我无尽的感谢和初生的孩子,无论谁能帮助我。
这里的培训相关的代码保存会话实体:
for (NSDictionary *session in self.sessions){
NSManagedObject *newSession = [NSEntityDescription insertNewObjectForEntityForName:[sessionEntity name] inManagedObjectContext:self.managedObjectContext];
[newSession setValue:[session valueForKey:@"ID"] forKey:@"id"];
[newSession setValue:[session valueForKey:@"notes"] forKey:@"notes"];
[newSession setValue:[session valueForKey:@"length"] forKey:@"length"];
//get the speaker value;
[newSession setValue:[self setupSpeaker:[session valueForKey:@"speaker"]] forKey:@"speaker"];
NSLog(@"now doing title");
//now get the title value;
[newSession setValue:[self setupTitle:[session valueForKey:@"title"]] forKey:@"title"];
NSLog(@"I got back this title:%@", [newSession valueForKey:@"title"]);
}
if (![self.managedObjectContext save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
下面是找到合适的扬声器和标题实体的关系(我知道这是相当冗余)代码
-(NSManagedObject *) setupSpeaker:(NSNumber *)id {
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Speaker" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"id==%@",id];
[fetchRequest setPredicate:predicate];
NSError *error;
NSArray *items=[self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
[fetchRequest release];
if ([items count]>=1){
return [items objectAtIndex:0];
}else{
return 0;
}
}
-(NSManagedObject *) setupTitle:(NSNumber *)id {
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Title" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
NSLog(@"now looking for: %@", id);
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"id==%@",id];
[fetchRequest setPredicate:predicate];
NSError *error;
NSArray *items=[self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
[fetchRequest release];
if ([items count]>=1){
NSLog(@"found %@", id);
return [items objectAtIndex:0];
}else{
return 0;
}
}
最后,这里是日志崩溃时说的:
2010-02-20 16:48:17.134 iconf[1438:207] now looking for: 1
2010-02-20 16:48:17.136 iconf[1438:207] found 1
2010-02-20 16:48:17.156 iconf[1438:207] I got back this title:<NSManagedObject: 0x3b11a10> (entity: Title; id: 0x3d4a3c0 <x-coredata://B76F62BD-AC82-4335-9013-7529C2471F9C/Title/p6> ; data: {
id = 1;
session = (
0x3d51640 <x-coredata:///Session/t2765697F-14C9-4282-A067-10A2413732B834>
);
title = "Bill Gates Speaks";
})
2010-02-20 16:48:17.158 iconf[1438:207] now doing title
2010-02-20 16:48:17.158 iconf[1438:207] now looking for: 2
2010-02-20 16:48:17.159 iconf[1438:207] found 2
2010-02-20 16:48:17.161 iconf[1438:207] I got back this title:<NSManagedObject: 0x3b16fd0> (entity: Title; id: 0x3d4d7a0 <x-coredata://B76F62BD-AC82-4335-9013-7529C2471F9C/Title/p12> ; data: {
id = 2;
session = (
0x3b1b320 <x-coredata:///Session/t2765697F-14C9-4282-A067-10A2413732B835>
);
title = "Lecture on Frogs";
})
2010-02-20 16:48:17.161 iconf[1438:207] *** -[NSManagedObject compare:]: unrecognized selector sent to instance 0x3b11a10
2010-02-20 16:48:17.162 iconf[1438:207] Serious application error. Exception was caught during Core Data change processing: *** -[NSManagedObject compare:]: unrecognized selector sent to instance 0x3b11a10 with userInfo (null)
2010-02-20 16:48:17.163 iconf[1438:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSManagedObject compare:]: unrecognized selector sent to instance 0x3b11a10'
2010-02-20 16:48:17.163 iconf[1438:207] Stack: (
如果你可以设置调试器并找出它到底崩溃的线路,它将会有很大的帮助。如果您发布数据模型的图表,这样也可以帮助我们清楚地看到这些关系。 – TechZen 2010-02-21 01:45:10