2009-08-12 3 views
6

나는 코코아에서 응용 프로그램을 개발 중입니다. 나는 중대한 문제에 직면하고있다."핵심 데이터가 오류를 수행 할 수 없습니다."오류

나는 다음과 같은 코드를 사용하여 코어 데이터에서 "디렉토리"라는 개체의 항목을 삭제하고 있습니다 :

NSEnumerator *tempDirectories = [[folderArrayController arrangedObjects] objectEnumerator]; 
id tempDirectory; 
while (tempDirectory = [tempDirectories nextObject]){ 
    [managedObjectContext deleteObject:tempDirectory]; 
} 

그러나하는 동안 때때로 "코어 데이터가 오류를 수행 할 수 없습니다 ..."와 같은 예외가 발생합니다 삭제 후에 저장하십시오. 코드를 사용 중입니다. [managedObjectContext save];

저는 Core Data에서 새로운 ... 솔루션을 기대합니다.

+1

세 번째 단락을보십시오. [Fault can not fulfill] (http://developer.apple.com/documentation/Cocoa/Conceptual/CoreData/Articles/cdTroubleshooting.html#//apple_ref/doc/uid/TP40002320- SW7) –

+0

그러나이 예외의 원인이되는 정확한 모듈을 디버그하고 찾아내는 방법은 무엇입니까? –

답변

4

이것은 오래된 질문이며, 지금 당분간이 문제를 해결하기 위해 노력하고 있습니다. 그래서 그것을 문서화하는 것이 가장 좋을 것이라고 생각했습니다.

위에서 언급 한 바와 같이, the Apple documentation은이 예외에 대한 이유를 올바르게 지적합니다. 그러나 NSManagedObject 하위 클래스의 객체가 유지되는 모듈을 확인하는 것은 대단한 일입니다 (설명서의 첫 번째 인용 이유가 문제의 근본 원인 인 경우).

그래서 NSManagedObject를 유지하고 있던 코드 부분을 식별하여 시작 했으므로 NSManagedObjectID를 유지하고 필요할 때마다 관리되는 객체를 생성했습니다. 비슷한 라인의 논의는 Restkit 문서에서 찾을 수 있습니다

  1. https://github.com/RestKit/RestKit/commit/170060549f44ee5a822ac3e93668dad3b396dc39
  2. https://github.com/RestKit/RestKit/issues/611#issuecomment-4858605

내 세터를 업데이트하고 내부적으로 우리가 의존하면서 모듈의 나머지 부분과 인터페이스가 동일하게 유지되도록 게터 따라 NSManagedObjectID 및 유지 NSManageObject :

-(CSTaskAbstract*)task 
{ 
    CSTaskAbstract *theTask = nil; 
    if (self.taskObjectID) 
    { 
     NSManagedObjectContext *moc = [(CSAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
     // https://github.com/RestKit/RestKit/commit/170060549f44ee5a822ac3e93668dad3b396dc39 & 
     // https://github.com/RestKit/RestKit/issues/611#issuecomment-4858605 
     NSError *theError = nil; 
     NSManagedObject *theObject = [moc existingObjectWithID:self.taskObjectID 
                 error:&theError]; 
     if ([theObject isKindOfClass:[CSTaskAbstract class]]) 
     { 
      theTask = (CSTaskAbstract*)theObject; 
     } 
    } 
    return theTask; 
} 
-(void)setTask:(CSTaskAbstract *)inTask 
{ 
    if (inTask!=self.task) 
    { 
     // Consequences of retaining a MO when it is detached from its MOC 
     [self setTaskObjectID:[inTask objectID]]; 
    } 
} 

위의 첫 번째 hal 문제의 해결 f. 우리는 앱의 의심스러운 부분에 대한 의존성을 찾아 제거해야합니다.

다른 문제도있었습니다. 악기 -> 할당은 관리 대상 개체를 실제로 보유하고있는 모듈을 찾는 좋은 소스입니다. 예외 개체는 어떤 관리 대상 개체가 문제를 생성하는지에 대한 세부 정보를 가지며 그 결과를 필터링합니다 아래 그림과 같이 객체 : 우리는 관리되는 개체에 KVO를 수행했다

Instruments - Allocations

. KVO는 관측 된 관리 대상 객체를 보유하므로 예외가 발생하고 다시 추적하는 것이 프로젝트 내에서 수행되지 않습니다. 이들은 디버깅하기가 매우 어렵지만 작업을 추측하고 객체의 할당 및 유지 - 릴리스주기를 추적하는 것이 확실하게 도움이 될 것입니다. 나는 KVO 관찰 부분을 제거하고 모두 작동하기 시작했다.

+0

+1 Apple doc 링크 – Martin

관련 문제