2012-02-22 2 views
0

데이터에 NSManagedObject 하위 클래스를 사용하는 NSPersistentDocument 하위 클래스가 있습니다.CoreData 자동 저장 후 자동 저장 후 모든 데이터를로드하지 않음

새 문서가 열리면 데이터 구조를 초기화합니다 (필드를 채우는 것은 간단합니다). 내가 알아챈 것은 제목없는 문서가 자동 저장되고 응용 프로그램이 다시 열리면 해당 문서가로드된다는 것입니다. 응용 프로그램이 종료되면 사용자는 저장 대화 상자를 표시하지 않습니다 (기본값). 창이 닫히면 사용자가 수행합니다.

첫 번째 질문 :

나는 사용자가 응용 프로그램을 종료 할 때 저장 대화 상자를 호출합니다. 나는이 Untitled 문서가 (정상적인 상황에서) 매달리고 싶지 않다. 나는 그것이 저장되거나 쓰레기가되기를 원한다.

내가 작성하려고 시도 : 문서를 트리거하기 위해

- (void)applicationWillTerminate:(NSNotification *)aNotification 

가 저장 될 수 있습니다. 이 시점에서 컨텍스트에서 save:을 호출하면 오류가 발생합니다. 내가 알 수있는 바로는 사용자가 아직 파일을 저장하지 않았기 때문입니다. 또한 [self close]; 또는 [[self windowForSheet] close];을 호출하면 저장하지 않고 창을 닫을 수 있습니다.

저장 대화 상자를 강제로 표시하려면 어떻게해야합니까? 제목없는 문서는 어떻게 휴지통에 담을 수 있습니까?

두 번째 질문 (아니, 내가 셀 수 없다) :

응용 프로그램이 시작이, 나, 나는의 상태를 추적하기 위해 노력하고있어 처리 할 수있는 제목 없음 문서가 없을 수도 있습니다 언제부터 다른 모델. 나는 이미 Untitled 문서가 나올 때 초기 데이터 (내가 이전에 언급 한)가 존재한다는 것을 발견했다. 다른 모델에는 채워진 데이터에 대한 성공 플래그/상태를 비롯하여 일부 메타 데이터가 있습니다. 채워진 데이터가 모두 제 위치에 있고 올바른 경우 상태는 그대로 표시됩니다. 안타깝게도 기존 Untitled 문서로 시작할 때 채워진 데이터가로드되는 동안 메타 데이터 클래스는로드되지 않습니다.

- (bool) createGameState { 
    NSEntityDescription* description = [NSEntityDescription entityForName:[GameState name] inManagedObjectContext:[self managedObjectContext]]; 
    NSFetchRequest* req = [[NSFetchRequest alloc] init]; 
    [req setEntity:description]; 

    NSError *error = nil; 
    NSArray *array = [[self managedObjectContext] executeFetchRequest:req error:&error]; 
    [req release]; 
    req = nil; 

    GameState* result = nil; 
    if (array) { 
    NSUInteger count = [array count]; 
    if (!count) { 
     // Create the new GameState. 
     DebugLog(@"Creating GameState"); 
     result = [NSEntityDescription insertNewObjectForEntityForName:[GameState name] inManagedObjectContext:[self managedObjectContext]]; 
     [result setIsLoaded:[NSNumber numberWithBool:NO]]; 
    } else { 
     if (count > 1) { 
     NSLog(@"WARNING: Potentially Corrupt Game State. found: %lu", count); 
     } 
     result = [array objectAtIndex:0]; 
     if ([result isLoaded]) { 
     [self variantLoaded]; 
     } else { 
     // In this case, we have an aborted set-up. Since the game isn't 
     // playable, just refuse to create the GameState. This will 
     // force the user to create a new game. 
     return NO; 
     } 
    } 
    } else { 
    DebugLog(@"error: %@", error); 
    } 

    [game setState:result]; 
    return result; 
} 

참고 해당 배열은 다음과 같습니다

이 시점에서 코드의 거칠기를, 서하십시오, 나는 그것을 내가 다시 떨어져 그것을 연마하기 전에 내가 방법을 작동하고 있음을 볼 수있을 때까지 그것을 일 처리 해요 항상 존재하고, 카운트는 항상 0입니다. 아니요, 명시 적으로 save:으로 전화하지는 않습니다. 표준 자동 저장 또는 저장을 수행하는 사용자에게 의존하고 있습니다.

편집 :

은 내가 코어 데이터 편집기 응용 프로그램을 설치했습니다. 데이터를 저장하는 것이 아니라로드하는 데 문제가 있음이 밝혀졌습니다. (참고 : 다른 문제로 인해 XML로 저장하라는 지시를 받으면 앱이 바이너리로 저장되므로 머리가 많이 부딪칩니다.)

유형이 모든 개체를 선택해야하는 가장 간단한 코드로 분류했습니다 배열에있는 GameState. 그것은 저장된 파일에서 해당 유형의가 명확하게되는 객체에도 불구하고, 아무도 검색하지 :

NSManagedObjectContext* moc = [self managedObjectContext]; 
    NSEntityDescription* entity = [NSEntityDescription entityForName:@"GameState" inManagedObjectContext:moc]; 

    NSFetchRequest* req = [[NSFetchRequest alloc] init]; 
    [req setEntity:entity]; 


    NSError *error = nil; 
    NSArray *array = [moc executeFetchRequest:req error:&error]; 

배열이 null이 아니라 [array count]이 시점에서 0

, 나는 간단 뭔가 같은데요 나는 그것을 간과하고있다.

두 번째 편집 :

나는 -com.apple.CoreData.SQLDebug 5을 추가 SQLite는로 저장. executeFetchRequest을 호출해도 디버그 로그가 생성되지 않습니다. 로그에 INSERT INTO ZGAMESTATE 항목이 표시되는 것을 볼 수 있습니다. executeFetchRequest이 백엔드로 전달되지 않는 것 같습니다.

셋째 EDIT (이 화상) : (나는 다른과 한으로)

내가 코어 데이터를 사용하여, 새로운 Xcode 프로젝트를 만들었습니다. 이 함수 하나만 복사하고 (필요한 경우 스터 빙) windowControllerDidLoadNib에 전화를 걸었습니다. 이 새로운 프로젝트에서는 위의 코드가 작동합니다.

+0

참조 된 머리를 두드리는 질문 : http://stackoverflow.com/questions/9404962/coredata-not-setting-type-as-xml –

답변

0

발견.

Document- (id) init 호출에 개체가 잘못로드되었습니다. windowControllerDidLoadNib (테스트 버전에서 수행 한 작업)으로 이동하여 정상적으로 작동합니다.