在现有项目中使用核心数据

时间:2011-09-29 12:39:03

标签: iphone core-data

我需要使用核心数据来保存我项目的数据,到目前为止我所做的编译得很好,但是当我真正开始使用核心数据存储时,程序就退出了,我不知道原因。我在appDelegate文件中为核心数据设置了所有必需的组件,我想将数据存储在名为viewController的{​​{1}}中。这就是我所做的:

DetailViewController

核心数据的所有组件都已实施

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after application launch.

    // Set the tab bar controller as the window's root view controller and display.
    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];

//this is what I added, reference managedObjectContext in the detail view controller.

    detailViewController = [[DetailViewController alloc] init];
    detailViewController.managedObjectContext = [self managedObjectContext];

    return YES;
}

当我尝试在详细信息视图中调用方法来存储数据时,程序退出。

- (NSManagedObjectContext *) managedObjectContext {
    if (managedObjectContext != nil) {
        return managedObjectContext;
    }
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        managedObjectContext = [[NSManagedObjectContext alloc] init];
        [managedObjectContext setPersistentStoreCoordinator: coordinator];
    }

    return managedObjectContext;
}

- (NSManagedObjectModel *)managedObjectModel {
    if (managedObjectModel != nil) {
            return managedObjectModel;
    }
    managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];

    return managedObjectModel;
}

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    if (persistentStoreCoordinator != nil) {
        return persistentStoreCoordinator;
    }
    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory]
                                           stringByAppendingPathComponent: @"MyProjectName.sqlite"]];
    NSError *error = nil;
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
                              initWithManagedObjectModel:[self managedObjectModel]];
    if(![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                             configuration:nil URL:storeUrl options:nil error:&error]) {
        /*Error for store creation should be handled in here*/
    }

    return persistentStoreCoordinator;
}

- (NSString *)applicationDocumentsDirectory {
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}

-(IBAction) addItem { Info *info = [NSEntityDescription insertNewObjectForEntityForName:@"Info" inManagedObjectContext:managedObjectContext]; info.name = item.name; } 是详细视图中的当前对象,item是模型类文件。我在这里想念一下吗?

谢谢!

更新

控制台中的错误消息是:

由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'+ entityForName:无法找到实体名称'Info''的NSManagedObjectModel

但是我在“Resources”文件夹中有一个Info.xcdatamodel文件,实体名称是“Info”。

2 个答案:

答案 0 :(得分:1)

您是否致电[self.managedObjectContext save:&error]

此外,您的捆绑加载例程可能无法正常工作。尝试加载managedObjectContext,如下所示:

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"ModelName" 
   withExtension:@"momd"];
__managedObjectModel = [[NSManagedObjectModel alloc] 
   initWithContentsOfURL:modelURL];    
return __managedObjectModel;

答案 1 :(得分:0)

我的猜测是,在您的详细视图控制器中,您要么没有合成managedObjectContext,要么在创建详细视图控制器时没有初始化它。检查这两个都在完成。如果这不能解决问题,请在崩溃后检查控制台输出,并在您的问题更新中发布任何相关信息。