2014-04-05 3 views
0

핵심 데이터에서로드 된 사람을 나타내는 셀이있는 테이블보기를로드하려고합니다. 그리고 내가 새로운 개체를 삽입하고 컨텍스트를 저장 응용 프로그램을 실행 단지 처음 관리되는 개체 컨텍스트가 저장되지 않았습니다.

@property (nonatomic,strong) NSManagedObjectContext* managedObjectContext; 

... 

- (NSManagedObjectContext*) managedObjectContext { 
    if(!_managedObjectContext) { 
     NSFileManager* manager= [NSFileManager defaultManager]; 
     NSURL* URL= [manager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask].firstObject; 
     URL= [URL URLByAppendingPathComponent:@"PeopleDocument"]; 
     UIManagedDocument* document= [[UIManagedDocument alloc]initWithFileURL:URL]; 

     if([manager fileExistsAtPath:URL.path]) { 
      [document openWithCompletionHandler:^(BOOL success) { 
      }]; 
     } else { 
      [document saveToURL:URL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) { 
      }]; 
     } 
     NSManagedObjectContext* context= [document managedObjectContext]; 
     _managedObjectContext= context; 
    } 
    return _managedObjectContext; 
} 

:

[NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext: self.managedObjectContext]; 
[self.managedObjectContext save:NULL]; 

나는 또한 로그 시도를이 내가 컨텍스트를 얻을 방법입니다 save:의 결과는 YES이고 오류는 없습니다. 하지만 컨텍스트는 진정으로 저장되지 않습니다. 두 번째로 가져온 엔티티 배열이 비어있는 앱을 실행합니다.

업데이트

뭔가 심지어 낯선 일이 : 다른 유사한 질문에 this answer를 읽고, 나는 구원 문서를 강제하는 방법을 발견했습니다

- (void) save { 
    NSError *error = nil; 

    if (![self.managedObjectContext save:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 

    [self.managedDocument saveToURL:self.managedDocument.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:^(BOOL success) 
    { 
     NSLog(@"Saved: %d",success); 
    }]; 

} 

그래서 나는이 코드를 실행 처음 앱을 실행할 때 :

#if FIRST_TIME 
    [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext: self.managedObjectContext]; 
    [self save]; 
#endif 

그 후, FIRST_TIME을 z로 설정하면 에로, 두 번째는 내가 빈 레코드를 얻을 응용 프로그램을 실행합니다. 하지만 3 번째로 앱을 실행하면 FIRST_TIME을 1로 설정하면 이전에 만든 모든 레코드를 얻을 수 있습니다 (플러스 생성 된 레코드). 즉, 새 엔티티를 작성하고 저장하면 이전에 작성한 모든 엔티티가 올바르게 반입됩니다. 그렇지 않으면 엔티티가 반입되지 않습니다.

PS : 다시 확인 : 관리되는 개체 컨텍스트는 self.managedDocument.managedObjectContext에 의해 반환 된 정확한 컨텍스트입니다.

답변

0

. 대신 UIManagedDocument를 사용, 그때 나는 그것이 영구 저장소 코디네이터의 설정, alloc + initWithConcurrencyType:와 컨텍스트를 생성 : 나는 또한 다른 방법이 올바른지 생각

- (NSManagedObjectContext*) managedObjectContext { 
    if(!_managedObjectContext) { 
     NSURL* URL= [[NSBundle mainBundle] URLForResource:@"People" withExtension:@"momd"]; 
     NSManagedObjectModel* model= [[NSManagedObjectModel alloc]initWithContentsOfURL:URL]; 
     NSPersistentStoreCoordinator* storeCoordinator= [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel: model]; 
     NSURL* storeURL= [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask].lastObject; 
     storeURL= [storeURL URLByAppendingPathComponent:@"MOC.sqlite"]; 

     NSError* error; 
     [storeCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]; 
     if(error) { 
      NSLog(@"Cannot create new store %@",error); 
      return nil; 
     } 

     _managedObjectContext= [[NSManagedObjectContext alloc]initWithConcurrencyType: NSMainQueueConcurrencyType]; 
     _managedObjectContext.persistentStoreCoordinator= storeCoordinator; 
    } 

    return _managedObjectContext; 
} 

하지만 어쩌면 나는 다른에 문서를 저장했다 방법.

0

코드에 동일한 self.managedObjectContext이 표시되지 않는 것처럼 들립니다. 메서드에서 액세스하는 managedObjectContext가 붙여 넣은 첫 번째 메서드에서 만든 첫 번째 것과 동일한 지 다시 한 번 확인 했습니까? 나는이 두 가지 방법을 통해 단계를 밟아서 그들이 같은 대상인지 확인합니다.

첫 번째 방법에서는 self.managedObjectContext을 설정하지 않고 _managedObjectContext으로 설정하는 것처럼 보입니다. 그 두 같은 일이 있다면, 당신은 당신의 파일에이 곳처럼 뭔가를해야한다 : 나는 단지 관리되는 개체 컨텍스트를 만들 내 방식을 변경

@synthesize managedObjectContext = _managedObjectContext; 
+0

일부 디버그를 만들었습니다. getter가 반환하는 관리 객체 컨텍스트는 항상 동일합니다. 속성은 이미 합성되었습니다. 질문에 속성 선언을 추가하겠습니다. –