【问题标题】:Using core data in an existing project在现有项目中使用核心数据
【发布时间】:2026-01-27 00:50:02
【问题描述】:

我需要使用核心数据来为我的项目持久化数据,到目前为止我所做的编译都很好,但是当我真正开始使用核心数据存储东西时,程序就退出了,我不知道原因。我在 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 传递给它。

标签: iphone core-data


【解决方案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分配给了详细视图控制器之一。