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

Posted

技术标签:

【中文标题】在现有项目中使用核心数据【英文标题】:Using core data in an existing project 【发布时间】:2011-09-29 12:39:03 【问题描述】:

我需要使用核心数据来为我的项目持久化数据,到目前为止我所做的编译都很好,但是当我真正开始使用核心数据存储东西时,程序就退出了,我不知道原因。我在 appDelegate 文件中为核心数据设置了所有必需的组件,并且我想将数据存储在一个名为 DetailViewControllerviewController 中。这是我所做的:

- (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 是详细视图中的当前对象,Info 是模型类文件。我在这里想念什么吗?

谢谢!

更新:

控制台中的错误信息是:

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

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

【问题讨论】:

您的模型中是否有实体@"Info"?调试控制台显示什么错误? 是的,模型文件已创建,实体名称为“Info”。 managedObjectContext != nil 吗? 调试控制台显示什么错误? 检查您的托管对象模型方法。您需要在此处指定模型文件,此时您将 nil 传递给它。 【参考方案1】:

你打电话给[self.managedObjectContext save:&error]了吗?

另外,您的包加载例程可能无法正常工作。尝试像这样加载 managedObjectContext:

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

【讨论】:

嗨,我找不到以“momd”扩展名结尾的文件或目录,现在我又遇到了另一个问题,当我删除原始模型文件并在它,错误说“无法合并具有两个不同实体的模型”。 似乎您的项目文件在引用其他文件夹中的托管对象模型时被搞砸了。删除磁盘和项目资源管理器中对模型的所有引用(我认为这是错误)。然后重新创建。也重置 ios 模拟器。这应该可以解决这个困惑。 啊,终于解决了,把“momd”改成“mom”就好了……谢谢~【参考方案2】:

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

【讨论】:

我已经在.m文件中合成了它,我没有初始化它,因为我已经在appDelegate文件中引用了它,并且将appDelegate中的managedObjectContext分配给了详细视图控制器之一。

以上是关于在现有项目中使用核心数据的主要内容,如果未能解决你的问题,请参考以下文章

iPhone - 将核心数据添加到现有项目?

核心数据对现有项目 iphone 的影响

核心数据 - 删除项目

如何将EF核心搭建到现有数据库?

如何在 xcode 5 现有项目中添加前缀文件?

如何将现有核心数据 iOS 7 应用程序的数据迁移到 iCloud?