核心数据和UITabBar控制器 - 帮助?

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引用它.啊,这感觉太棒了:)

ger*_*ry3 6

您的托管对象上下文可能未设置,实体"事件"显然对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)