development

'+ entityForName : nil은 합법적 인 NSManagedObjectContext 매개 변수가 아닙니다-핵심 데이터

big-blog 2020. 10. 26. 08:11
반응형

'+ entityForName : nil은 합법적 인 NSManagedObjectContext 매개 변수가 아닙니다-핵심 데이터


관련 코드를 모두 App Delegate에 추가했으며 데이터 모델에 추가하고 applicationDidFinishLaunchingWithOptions의 데이터 모델에서 가져올 수 있습니다.

내 문제는 내 View Controller에서 데이터 모델에 쓰려고 할 때 발생합니다. 이 코드를 헤더 파일에 추가했습니다.

NSFetchedResultsController *fetchedResultsController;
NSManagedObjectContext *managedObjectContext;

@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;

그리고이 코드를 내 구현 파일에 :

NSManagedObjectContext *context = [self managedObjectContext];
NSManagedObject *model = [NSEntityDescription
                          insertNewObjectForEntityForName:@"Events" 
                          inManagedObjectContext:context];
[model setValue:@"Sample Event" forKey:@"eventName"];

NSError *error;
if (![context save:&error]) {
    NSLog(@"Couldn't save: %@", [error localizedDescription]);
}

그러나 다음과 같은 오류가 발생합니다.

'NSInvalidArgumentException', reason: '+entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name 'Events''

무슨 일인지 아는 사람 있나요? 어떤 도움을 주시면 감사하겠습니다.


segues를 사용하는 경우 컨텍스트를 라인 아래로 전달하지 않으면 동일한 문제가 발생합니다. segue를 시작하는 클래스의 prepareForSegue 메소드에서 다음 코드를 사용하십시오.

[[segue destinationViewController] setManagedObjectContext:self.managedObjectContext];

물론 "managedObjectContext"라는 속성에 컨텍스트가 있다고 가정합니다.


컨텍스트를 뷰 컨트롤러에 전달하는 것을 잊었습니다. 신인 오류.


데이터베이스에서 데이터를 가져 오기 시작하기 전에 다음 코드를 포함하여 컨텍스트를 전달할 수 있습니다.

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate];
context = [appDelegate managedObjectContext];

이것을 viewController에 추가해야합니다.

 id delegate = [[UIApplication sharedApplication] delegate];
    self.managedObjectContext = [delegate managedObjectContext];

이 문제가 생겼고 동료가 도와주었습니다. 이 오류 메시지가 표시되는 경우 : "entityForName : nil은 엔티티 이름을 검색하는 유효한 NSManagedObjectContext 매개 변수가 아닙니다." 그리고 핵심 데이터 모델을 변경했습니다. 문제 가 코드가 아닐 수도 있다고 생각합니다 .

해결책은 간단 할 수 있습니다. 다음 옵션 중 하나를 시도하십시오.

  • 테스트중인 기기에서 앱을 삭제하기 만하면 이전 버전의 모델이 있어야합니다.
  • Xcode,> Editor> Add Model Version을 사용하여 다른 데이터베이스 버전을 만듭니다.

도움이 되었기를 바랍니다.


제 경우 .xcdatamodeld에는 AppDelegate에서 레이블이 잘못 지정되었습니다.

 let container = NSPersistentContainer(name: "name of data model")

대상 뷰 컨트롤러가 NavigationController에 포함 된 경우 컨텍스트를 다음과 같이 적절하게 설정해야합니다.

  self.mydetailViewController = [[[segue destinationViewController] viewControllers] objectAtIndex:0];
 [self.mydetailViewController setManagedObjectContext:self.managedObjectContext];

나는 게으른 초기화의 팬입니다. 이렇게하면 테스트를 위해 새 컨텍스트를 삽입해야하는 경우 가능합니다. 또는 MOC를 설정 한 경우 앱 델리게이트에서 컨텍스트를 가져옵니다.

class.h
@property (strong, nonatomic,getter=getManagedObjectContext) NSManagedObjectContext *managedObjectContext;

class.m
    -(NSManagedObjectContext *)getManagedObjectContext {
        if (_managedObjectContext) {
            return _managedObjectContext;
        }
        _managedObjectContext = [[(AppDelegate *)[[UIApplication sharedApplication]delegate]sharedDataModel]managedObjectContext];
        return _managedObjectContext;
    }

참고 URL : https://stackoverflow.com/questions/11596487/entityforname-nil-is-not-a-legal-nsmanagedobjectcontext-parameter-core-data

반응형