Zac*_*man 2 iphone core-data objective-c uitabbarcontroller iphone-sdk-3.0
所以我有一个带有UITabBarController和一些导航控制器的Project,我正在尝试实现Core Data.它只是不工作.
我有一个奇怪的设置:UITabBarController - >导航控制器 - >表视图控制器
我复制了所有的核心数据代码并添加了一个带有属性的实体('Event'和'name' - 就像教程一样).我一直收到错误:由于未捕获的异常'NSInternalInconsistencyException'而导致应用程序失败,原因:'+ entityForName:无法找到实体名称的'NSManagedObjectModel'事件''
只有当我切换到我希望由Core Data内容填充的表视图时才会出现错误.
我发现表视图控制器中的这一行发生了错误:
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:managedObjectContext];
这似乎与此相符(在App Delegate中):
NSManagedObjectContext *context = [self managedObjectContext];
if (!context) {
// Handle the error.
Run Code Online (Sandbox Code Playgroud)
NSLog(@"\nCould not create *context for self");
}
rootViewController.managedObjectContext = context;
Run Code Online (Sandbox Code Playgroud)
任何帮助?
更新:我设法让它工作(非常激动人心的时刻,而斯坦福在半场赢了 - 到目前为止这是一个美好的一天).我现在从App Delegate引用它.啊,这感觉太棒了:)
您的托管对象上下文可能未设置,实体"事件"显然对nil上下文无效.
我在所有视图控制器中使用对app delegate的引用,以便它们可以访问一个托管对象上下文.听起来其他人经常使用单例管理核心数据,并从中获取托管对象上下文.
UPDATE
关于将核心数据堆栈保存在何处将"核心数据堆栈"放置在Cocoa/Cocoa Touch应用程序中,有一个很好的讨论.
以下是一些用于将Core Data堆栈保留在app delegate中的示例代码:
在YourAppDelegate中使用Apple的标准Core Data堆栈实现.managedObjectContext是作为示例实现的,但也必须实现managedObjectModel和persistentStoreCoordinator.
YourAppDelegate.h:
@interface YourAppDelegate : NSObject <UIApplicationDelegate> {
// Core Data stuff
NSManagedObjectModel *managedObjectModel;
NSManagedObjectContext *managedObjectContext;
NSPersistentStoreCoordinator *persistentStoreCoordinator;
// other app ivars
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
在每个视图控制器中,获取对app委托的引用,并根据需要使用它来获取managedObjectContext.例如,在设置fetchedResultsController时;
RootViewController.h:
@interface RootViewController : UITableViewController <NSFetchedResultsControllerDelegate> {
NSFetchedResultsController *fetchedResultsController;
YourAppDelegate *app;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)