2010-02-20 3 views
0

저는 믿을 수 없을만큼 불만스러운 핵심 데이터 충돌을 디버깅 할 수 있기를 바랍니다. 처음에는 두 개의 엔티티 ('스피커'와 '제목'을 나타내는)에 데이터를로드하고 '세션'에 대한 세 번째 엔티티를로드하고 '스피커'및 '제목'과의 관계를 설정하려고합니다. (세션에서 발표자 및 제목은 일대일이며, 발표자/제목에서 세션으로, 일대 다). 정수 키를 사용하여 각 관계를 설정합니다.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: (
+0

디버거를 설정하고 충돌하는 라인을 정확히 찾아내는 것이 도움이 될 것입니다. 관계를 명확하게 볼 수 있도록 데이터 모델의 pict를 게시하면 도움이됩니다. – TechZen

답변

1

그것은 당신의 데이터 모델 같은 소리 (해야)과 같이 :

스피커 < - >> 세션
제목 < - >> 세션

스피커 및 제목이 모두 각이 어디 to-many 관계에 세션. 이를 바탕으로

:

나는 각 관계를 설정하는 정수 키를 사용합니다.

코드와 관계를 수동으로 관리하는 것처럼 보입니다. 왜 이런 짓을하는?! 그것은 복잡하고 불필요합니다. 핵심 데이터 데이터 모델에서 실제 관계를 설정하고 사용하십시오.

또한 objective-C의 키워드이기 때문에 속성 이름에 "id"를 사용하지 마십시오.

0

감사합니다. 아래는 데이터 모델의 복사본입니다. 기본 레이아웃에 대해 옳습니다.이 그래서 세 개의 속성 목록 (스피커 한 타이틀에 대한 하나의 데이터의 초기 하중을하고있어, 프로그램을 통해 처음이므로

http://www.freeimagehosting.net/image.php?debf5866c1.jpg

I 수동 관계를 설정하려고 이유는 , 하나는 세션 용). 이 작업을 수행하는 더 좋은 방법이 있습니까? 핵심 데이터를 근본적으로 이해할 수는 없지만, 세션 엔티티를 만들 때마다 새 타이틀 엔티티를 만들었던 것처럼, 제목과 세션이 일대일 관계가 아닌 일대일 관계가있는 것처럼 보입니다. 내가 원하는 많은 관계. 따라서 id 변수 (이 코드는 오류가 변경되지 않고 이름이 변경됨)를 코어 데이터에 대한 첫 번째로드의 키 역할을하기 위해 넣었습니다. 그 후에는 물론 코어 데이터를 사용하여 모든 것을 관리 할 것입니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

+0

먼저 두 명의 SO 사용자가 있습니까? 왜? 다음으로 질문에 대한 추가 내용을 답변으로 게시해서는 안됩니다. 필요하다면 원래 질문을 편집하거나 새로운 질문을 만들 수 있습니다. – gerry3

+0

plists에서 초기로드를 수행하거나 개발 중에 초기로드를 수행 한 다음 해당 데이터베이스 파일을 저장하고 프로젝트에 추가 할 수 있습니다. 그런 다음 출시 된 앱에서 데이터베이스 파일을 읽기 전용 앱 번들에서 Documents 디렉토리로 복사합니다. http://stackoverflow.com/questions/2265333/how-to-populate-core-data-with-initial-data/2267000#2267000 – gerry3

+0

핵심 데이터 관계를 이해하지 못합니다.를 참조하십시오. 가장 먼저해야 할 일은 엔티티의 하위 클래스를 만드는 것입니다. 그런 다음 이름을 통해 객체의 속성으로 속성 및 관계에 액세스 할 수 있습니다. 일 대 다 관계는 실제로 세트이므로 Xcode에서 서브 클래스를 작성할 때 제공되는 메소드로 단일 오브젝트 또는 오브젝트 세트를 추가 할 수 있습니다. – gerry3

관련 문제