2011-09-29 4 views
1

코어 데이터를 사용하여 프로젝트의 데이터를 유지해야합니다. 지금까지 수행 한 작업은 잘 수행되었지만 실제로 코어 데이터를 사용하여 작업을 저장하기 시작하면 프로그램이 종료되고 이유를 모르겠다. appDelegate 파일에서 핵심 데이터에 필요한 모든 구성 요소를 설정하고 DetailViewController이라는 viewController에 데이터를 저장하려고합니다. 여기에 내가 무엇을했는지이다 : 나는 데이터를 저장하기 위해 상세보기에서 메소드를 호출 할 때 핵심 데이터에 대한기존 프로젝트에서 코어 데이터 사용

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

    // Override point for customization after application launch. 

    // Set the tab bar controller as the window's root view controller and display. 
    self.window.rootViewController = self.tabBarController; 
    [self.window makeKeyAndVisible]; 

//this is what I added, reference managedObjectContext in the detail view controller. 

    detailViewController = [[DetailViewController alloc] init]; 
    detailViewController.managedObjectContext = [self managedObjectContext]; 

    return YES; 
} 

모든 구성 요소는

- (NSManagedObjectContext *) managedObjectContext { 
    if (managedObjectContext != nil) { 
     return managedObjectContext; 
    } 
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) { 
     managedObjectContext = [[NSManagedObjectContext alloc] init]; 
     [managedObjectContext setPersistentStoreCoordinator: coordinator]; 
    } 

    return managedObjectContext; 
} 

- (NSManagedObjectModel *)managedObjectModel { 
    if (managedObjectModel != nil) { 
      return managedObjectModel; 
    } 
    managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; 

    return managedObjectModel; 
} 

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 
    if (persistentStoreCoordinator != nil) { 
     return persistentStoreCoordinator; 
    } 
    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] 
              stringByAppendingPathComponent: @"MyProjectName.sqlite"]]; 
    NSError *error = nil; 
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] 
           initWithManagedObjectModel:[self managedObjectModel]]; 
    if(![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
              configuration:nil URL:storeUrl options:nil error:&error]) { 
     /*Error for store creation should be handled in here*/ 
    } 

    return persistentStoreCoordinator; 
} 

- (NSString *)applicationDocumentsDirectory { 
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 
} 

을 구현 한 프로그램이 종료됩니다.

-(IBAction) addItem { 
    Info *info = [NSEntityDescription insertNewObjectForEntityForName:@"Info" 
                inManagedObjectContext:managedObjectContext]; 
    info.name = item.name; 
} 

item은 상세 뷰의 현재 개체입니다, Info는 모델 클래스 파일입니다. 내가 여기 뭔가보고 싶니?

감사합니다.

업데이트 :

콘솔에서 오류 메시지가 : 응용 프로그램을 종료

인해 캐치되지 않는 예외 'NSInternalInconsistencyException', 이유에 '+ entityForName : 엔티티 이름에 대한 NSManagedObjectModel을 찾을 수 없습니다'정보 ''

하지만 "Resources"폴더에는 Info.xcdatamodel 파일이 있고 엔티티 이름은 "Info"입니다.

+0

모델에 엔티티'@ "정보가 있습니까? 디버그 콘솔에 표시되는 오류는 무엇입니까? – Nekto

+0

예, 모델 파일이 생성되었으며 엔티티 이름은 "Info"입니다. – Michael

+0

'managedObjectContext! = nil'입니까? – Nekto

답변

1

[self.managedObjectContext save:&error]으로 전화하셨습니까?

또한 번들 로딩 루틴이 올바르게 작동하지 않을 수 있습니다. 다음과 같이 managedObjectContext를로드 해보십시오.

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"ModelName" 
    withExtension:@"momd"]; 
__managedObjectModel = [[NSManagedObjectModel alloc] 
    initWithContentsOfURL:modelURL];  
return __managedObjectModel; 
+0

안녕하세요, "momd"확장자로 끝난 파일 또는 디렉토리를 찾을 수 없습니다. 이제 원래 모델 파일을 삭제하고 동일한 엔티티로 새 파일을 빌드 할 때 또 다른 문제가 발생합니다. 오류는 "Can 모델을 두 개의 다른 엔티티와 병합하지 마십시오. " – Michael

+0

프로젝트 파일이 엉망이되어 다른 폴더의 관리 객체 모델을 참조합니다. 디스크와 프로젝트 탐색기에서 모델에 대한 모든 참조를 제거합니다 (여기에 오류가 있습니다). 그런 다음 다시 만드십시오. iOS 시뮬레이터도 재설정하십시오. 이것은이 혼란을 해결해야합니다. – Mundi

+0

아, 마침내 해결 했어. "엄마"를 "엄마"로 바꿔 줘. 고마워 ~ – Michael

0

제 생각에는 디테일 뷰 컨트롤러에서 managedObjectContext을 합성하지 않았거나 디테일 뷰 컨트롤러를 생성 할 때 초기화하지 않았을 것입니다. 두 가지 작업이 모두 수행되고 있는지 확인하십시오. 그래도 문제가 해결되지 않으면 충돌 후 콘솔 출력을 확인하고 질문에 대한 업데이트에 관련 정보를 게시하십시오.

+0

.m 파일에서 합성했습니다. 이미 appDelegate 파일에서이 파일을 참조했고 appDelegate의 managedObjectContext가 Detail View Controller 중 하나에 할당되어 있기 때문에 초기화하지 않았습니다. – Michael

관련 문제