您的托管对象上下文可能未设置,并且实体“事件”显然对于 nil 上下文无效。
我在所有视图控制器中都使用了对我的应用委托的引用,因此它们可以访问一个托管对象上下文。听起来其他人经常使用单例来管理 Core Data,并从中获取托管对象上下文。
更新
在Where to place the “Core Data Stack” in a Cocoa/Cocoa Touch application 中有一个很好的讨论关于将核心数据堆栈保存在哪里。
以下是一些将 Core Data 堆栈保留在应用委托中的示例代码:
在 YourAppDelegate 中使用 Apple 的标准核心数据堆栈实现。 managedObjectContext 是作为示例实现的,但 managedObjectModel 和 persistentStoreCoordinator 也必须实现。
YourAppDelegate.h:
@interface YourAppDelegate : NSObject <UIApplicationDelegate> {
// Core Data stuff
NSManagedObjectModel *managedObjectModel;
NSManagedObjectContext *managedObjectContext;
NSPersistentStoreCoordinator *persistentStoreCoordinator;
// other app ivars
}
YourAppDelegate.m:
- (NSManagedObjectContext *) managedObjectContext {
if (managedObjectContext != nil) {
return managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
managedObjectContext = [[NSManagedObjectContext alloc] init];
[managedObjectContext setPersistentStoreCoordinator: coordinator];
}
return managedObjectContext;
}
在每个视图控制器中,获取对应用委托的引用,并根据需要使用它来获取 managedObjectContext。比如设置fetchedResultsController的时候;
RootViewController.h:
@interface RootViewController : UITableViewController <NSFetchedResultsControllerDelegate> {
NSFetchedResultsController *fetchedResultsController;
YourAppDelegate *app;
}
RootViewController.m:
#import "RootViewController.h"
#import "YourAppDelegate.h"
@implementation RootViewController
@synthesize fetchedResultsController;
- (void)viewDidLoad {
[super viewDidLoad];
app = (YourAppDelegate*)[UIApplication sharedApplication].delegate;
}
- (NSFetchedResultsController *)fetchedResultsController {
if (fetchedResultsController != nil) {
return fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:app.managedObjectContext];
[fetchRequest setEntity:entity];
// setup the batch size, predicate, & sort keys, etc
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:app.managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
[aFetchedResultsController release];
[fetchRequest release];
return fetchedResultsController;
}