web-dev-qa-db-ja.com

'+ entityForName:nilは有効なNSManagedObjectContextパラメーターではありません-コアデータ

関連するすべてのコードをアプリデリゲートに追加しました。データモデルに追加し、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''

誰が何が起こっているか知っていますか?任意の助けをいただければ幸いです。

72
Alex Godbehere

セグエを使用している場合、コンテキストを下に渡さないと同じ問題が発生します。セグエを開始するクラスのprepareForSegueメソッドで次のコードを使用します。

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

もちろん、「managedObjectContext」というプロパティにコンテキストを保持することを前提としています。

37
Tim

コンテキストをView Controllerに渡すのを忘れていました。ルーキーエラー。

46
Alex Godbehere

データベースからデータのフェッチを開始する前に、次のコードを含めることでコンテキストを渡すことができます。

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

あなたのviewControllerにこれを追加する必要があります:

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

私の場合、.xcdatamodeldはAppDelegateで誤ったラベルが付けられました。

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

この問題が発生し、同僚が助けてくれました。このエラーメッセージが表示された場合:「entityForName:nilは、エンティティ名を検索する有効なNSManagedObjectContextパラメーターではありません」。そして、コアデータモデルに変更を加えました。私は問題だと思いますコードではないかもしれません

解決策は簡単です。これらのオプションのいずれかを試してください。

  • テストするデバイスからアプリを削除するだけで、モデルの古いバージョンが必要になります。
  • Xcode、> Editor> Add Model Versionを使用して、別のデータベースバージョンを作成します。

それが役に立てば幸い。

2
rafaeljuzo

私は遅延初期化のファンです。この方法で、テストのために新しいコンテキストを挿入する必要がある場合、またはそこに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;
    }
0
SpaceTrucker

宛先View ControllerがNavigationControllerに埋め込まれている場合、コンテキストを次のように適切に設定する必要があります。

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