2010-11-19 3 views
0

필자는 (문서를 검색하여) 스스로 대답하려고 시도한 몇 가지 질문이 있지만 뭔가 누락 된 느낌이 들었습니다.핵심 데이터 문서 기반 응용 프로그램 : 문서 당 한 번만 인스턴스화되는 엔터티를 모델링하고 제어하려면 어떻게해야합니까?

힌트 (및/또는 적절한 문서에 대한 포인터)를 보내 주시면 감사하겠습니다.

코어 데이터 문서 기반 응용 프로그램을 구축하고 있습니다. 기본적으로 두 엔티티가 있습니다.

각 문서와 관련된 "비교"레코드가 하나 있습니다. 각 문서와 관련된 "노드"레코드가 잠재적으로 많습니다.

첫 번째 질문은 내가 올바르게 생각하고 있는지 여부입니다. 각 문서에 대해 하나의 비교 개체 만 있기 때문에 비교의 특성은 본질적으로 문서 자체의 특성입니다. 모델링을 선호하는 방법은 무엇입니까?

실제로 비교 엔티티가 올바른 방법 인 경우 다음 질문은 (단일) 비교 개체를 실제로 인스턴스화하는 방법과시기입니다. 사용자는 문서와 연관된 하나만 있기 때문에 비교를 명시 적으로 "추가"할 필요가 없습니다. 대신 하나의 Comparison 객체를 인스턴스화하여 managedObjectContext에 삽입해야합니다. 나는 다음과 같습니다 MyDocument.m 코드에 이미이 작업과 같은 무언가를 가지고 :

  • (무효) windowControllerDidLoadNib : (NSWindowController *) windowController { [슈퍼 windowControllerDidLoadNib : windowController] [NSEntityDescription insertNewObjectForEntityForName : @ "비교"inManagedObjectContext : managedObjectContext]; }

그러나 - 사용자가 새 문서를 만드는 경우 그러나 그것으로 모든 작업 않습니다 결코 - 그는 즉시 닫기 버튼 예를 클릭하지 않는 경우 - 다음 그는 "저장"을하도록 요구해서는 안 문서. 그는 실제로 어떤 정보라도 입력 한 경우에만 작업을 저장하도록 요청 받아야합니다. 이 동작을 구현하는 기본 방법이 있습니까?

답변

0

코드 스 니펫을 원래 게시물에 올바르게 삽입하지 않았습니다. 다시 시도 : 모델링에 대한

-(void)windowControllerDidLoadNib:(NSWindowController *)windowController { 
    [super windowControllerDidLoadNib:windowController]; 
    [NSEntityDescription insertNewObjectForEntityForName:@"Comparison" inManagedObjectContext:managedObjectContext]; 
} 
0

귀하의 질문은 매우 명확하지 않습니다, 당신은 당신의 "비교"엔티티가 어떻게해야 내용에 정교한하시기 바랍니다 당신이 그것을에 할당하는 속성이 어떤 종류의 할 수 있습니까? "Document"엔티티 구조를 보는 것이 편리 할 것이므로 우리는 유용한 입력을 제공 할 수 있습니다. 여기에 문서에 http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObject_Class/Reference/NSManagedObject.html#//apple_ref/occ/cl/NSManagedObject

if ([documentObject isUpdated]) { 
... 
} 

자세한 내용 : 당신의 NSManagedObject가 자신의 문서 또는하지를 저장하라는 메시지를 표시할지 여부를 결정하기 전에 업데이트 된 경우

두 번째 질문에 관해서

, 당신은 확인할 수 있습니다

건배, 로저

는 "문서"엔티티가 정말 없다
0

, 단순히 사용자가 사를 호출 할 때 저장 전체 문서를 참조하기 위해이 용어를 사용했다 ve 메뉴 항목. 아마도이 개념을 참조하는 더 좋은 방법이 있을까요? NSPersistentDocument?

약간의 백업 중 ...응용 프로그램의 핵심 아이디어는 두 개의 계층 적 디렉토리 구조 (시각적 재귀 "diff")를 비교하는 것입니다.

"비교"엔터티에는 두 개의 문자열 특성 인 pathA와 pathB가 있습니다.이 특성은 비교할 두 디렉터리의 이름입니다. 각 "Node"엔티티는 비교중인 디렉토리 트리에서 파일 이름을 나타냅니다. Node 엔티티에는 비교에 지정된 시작점에 상대적인 경로 인 하나 이상의 속성 ("relativePath")이 있습니다.

첫 번째 질문은 "비교"엔티티가 인스턴스화되기 때문에 (사용자가 "새"메뉴 항목을 호출 한 후 어느 시점에서) 인스턴스화 될 것이므로이 엔티티가 존재한다는 것이 합리적인지 여부입니다.

두 번째 질문은 단일 "비교"개체를 인스턴스화하여 managedObjectContext에 삽입해야하는 시점입니다. 즉,이를 수행하는 데 가장 적합한 방법은 무엇입니까?

마지막으로 "비교"개체가 자동으로 인스턴스화되면 (awakeFromNib 시간에?) 사용자가 진행하지 않기로 결정하고 닫기 버튼을 클릭하기 만하면 저장하라는 메시지가 표시되지 않습니다 (맞습니까?) 이것을 성취하는 적절한 방법이 될 수 있는가? 실제로 "빈"Comparison 객체는 실제로 시작할 때 자동으로 삽입되었지만 사용자가 수정하지 않았기 때문에 documentObject가 업데이트 된 것처럼 보입니다.

희망은 분명합니다 ... 감사합니다.

1

정확히 같은 문제로 고생하면서이 스레드를 발견했습니다. 필자는 Entity_A 테이블을 내 문서 기반 Core Data 응용 프로그램에서 사용하고 있지만 Entity_B 문서 당 필요한 단일 인스턴스를 처리하는 방법을 알아야합니다.

나는 작동하는 것처럼 보이는 것을 발견했습니다. 아마도 더 좋은 방법 일 것입니다. 그러나 이것은 지금이 장애물을 지나쳐 가고 있습니다.

문서의 xib가로드되면 나는 단순히 Entity_B가 생성되었는지 확인합니다. 그렇지 않다면 속성을 만들고 속성을 초기화합니다.

- (void)windowControllerDidLoadNib:(NSWindowController *)aController 
    { 
     [super windowControllerDidLoadNib:aController]; 

     //has an Entity_B been created? if not, create one. 
     NSError *theError = nil; 
     NSUInteger count = [[self managedObjectContext] countForFetchRequest:[NSFetchRequest fetchRequestWithEntityName:@"Entity_B"] error:&theError]; 

     if(count == 0) 
     { 
      NSManagedObject *newEntity_B = [NSEntityDescription insertNewObjectForEntityForName:@"Entity_B" inManagedObjectContext:[self managedObjectContext]]; 

      [newEntity_B setValue:[NSNumber numberWithBool:YES] forKey:@"boolAttribute"]; 
      [newEntity_B setValue:[NSNumber numberWithInt:2] forKey:@"intAttribute"]; 
     } 
    } 
관련 문제