関連するすべてのコードをアプリデリゲートに追加しました。データモデルに追加し、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''
誰が何が起こっているか知っていますか?任意の助けをいただければ幸いです。
セグエを使用している場合、コンテキストを下に渡さないと同じ問題が発生します。セグエを開始するクラスのprepareForSegueメソッドで次のコードを使用します。
[[segue destinationViewController] setManagedObjectContext:self.managedObjectContext];
もちろん、「managedObjectContext」というプロパティにコンテキストを保持することを前提としています。
コンテキストをView Controllerに渡すのを忘れていました。ルーキーエラー。
データベースからデータのフェッチを開始する前に、次のコードを含めることでコンテキストを渡すことができます。
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate];
context = [appDelegate managedObjectContext];
あなたのviewControllerにこれを追加する必要があります:
id delegate = [[UIApplication sharedApplication] delegate];
self.managedObjectContext = [delegate managedObjectContext];
私の場合、.xcdatamodeld
はAppDelegateで誤ったラベルが付けられました。
let container = NSPersistentContainer(name: "name of data model")
この問題が発生し、同僚が助けてくれました。このエラーメッセージが表示された場合:「entityForName:nilは、エンティティ名を検索する有効なNSManagedObjectContextパラメーターではありません」。そして、コアデータモデルに変更を加えました。私は問題だと思いますコードではないかもしれません。
解決策は簡単です。これらのオプションのいずれかを試してください。
それが役に立てば幸い。
私は遅延初期化のファンです。この方法で、テストのために新しいコンテキストを挿入する必要がある場合、またはそこに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;
}
宛先View ControllerがNavigationControllerに埋め込まれている場合、コンテキストを次のように適切に設定する必要があります。
self.mydetailViewController = [[[segue destinationViewController] viewControllers] objectAtIndex:0];
[self.mydetailViewController setManagedObjectContext:self.managedObjectContext];