저는 믿을 수 없을만큼 불만스러운 핵심 데이터 충돌을 디버깅 할 수 있기를 바랍니다. 처음에는 두 개의 엔티티 ('스피커'와 '제목'을 나타내는)에 데이터를로드하고 '세션'에 대한 세 번째 엔티티를로드하고 '스피커'및 '제목'과의 관계를 설정하려고합니다. (세션에서 발표자 및 제목은 일대일이며, 발표자/제목에서 세션으로, 일대 다). 정수 키를 사용하여 각 관계를 설정합니다.iPhone 코어 데이터 디버깅에 어려움이 있습니다.
주어진 스피커와 제목이 여러 세션을 가리킬 수 있으므로 적절한 관리 대상 개체를 검색하고 개체를 반환하는 함수를 작성했습니다. 나는 그 관계를 설정했다.
이것은 스피커 관계에는 문제가 없지만 두 번째 타이틀에서는 지속적으로 크래시가 발생합니다. 필자는 코드를 여러 가지 방법으로 여러 번 다시 작성했으며 항상 같은 문제로 끝납니다. 그리고 어떤 제목이 두 번째인지에 관계없이 문제가 존재합니다. 그래서 저는 근본적으로 잘못된 것을하고 있지만 더 많은 iPhone 3 Development의 핵심 데이터 챕터를 따라 가야합니다. 나에게 아무 것도 나오지 않습니다. 나는 누군가가 내가 무엇을 놓쳤는지를 볼 수 있기를 바라고있다. (마지막주의 : 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: (
디버거를 설정하고 충돌하는 라인을 정확히 찾아내는 것이 도움이 될 것입니다. 관계를 명확하게 볼 수 있도록 데이터 모델의 pict를 게시하면 도움이됩니다. – TechZen