Iphone 添加新版本的核心数据模型?

Iphone 添加新版本的核心数据模型?,iphone,objective-c,core-data,nsmanagedobject,Iphone,Objective C,Core Data,Nsmanagedobject,我刚刚创建了一个新版本的核心数据模型,其中包含一个额外的对象以及重新处理的关系 现在我有了两个文件,Medical\u Codes.xcdatamodel和Medical\u Codes\u2.xcdatamodel 我是否必须删除旧的NSManagedObject类文件并重新创建它们 我必须更改我的持久存储代码吗 - (NSManagedObjectModel *)managedObjectModel { if (__managedObjectModel != nil) {

我刚刚创建了一个新版本的核心数据模型,其中包含一个额外的对象以及重新处理的关系

现在我有了两个文件,
Medical\u Codes.xcdatamodel
Medical\u Codes\u2.xcdatamodel

我是否必须删除旧的
NSManagedObject
类文件并重新创建它们

我必须更改我的持久存储代码吗

- (NSManagedObjectModel *)managedObjectModel
{
    if (__managedObjectModel != nil)
    {
        return __managedObjectModel;
    }
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Medical_Codes" withExtension:@"mom"];
    __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    return __managedObjectModel;
}

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (__persistentStoreCoordinator != nil)
    {
        return __persistentStoreCoordinator;
    }

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Medical_Codes.sqlite"];

    NSFileManager *fileManager = [NSFileManager defaultManager];
    if (![fileManager fileExistsAtPath:[storeURL path]])
    {
        NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"Medical_Codes" ofType:@"sqlite"];

        if (!defaultStorePath)
        {
            NSLog(@"Error: Could not locate Medical_Codes.sqlite in app bundle");
            return nil;
        }

        NSError *error = nil;

        if (![fileManager copyItemAtPath:defaultStorePath toPath:[storeURL path] error:&error])
        {
            NSLog(@"Error copying sqlite from bundle to documents directory: %@, %@", error, [error userInfo]);
            return nil;
        }
    }

    NSError *error = nil;
    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
    {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }    

    return __persistentStoreCoordinator;
}

CoreData提供了从数据库的旧模式到新模式的不同级别的迁移。有时,您可以进行轻量级迁移,这意味着您不必做任何特殊的事情,只需创建新模型并生成新的托管对象类。下次启动应用程序时,模型管理器会发挥其神奇作用,将旧数据迁移到新模式

但是,当新模型与旧模型明显不同时,需要创建一个模型映射文件,为CoreData提供从旧到新映射所需的迁移信息。这个映射模型文件由Xcode复制到您的包中,模型管理器使用它进行必要的迁移

在运行时创建持久存储协调器的过程中,您还需要传递一些附加选项(因此,是的,您必须稍微更改持久存储协调器代码)。有点像:

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
    [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
    [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, 
    nil];

if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
    ...
}
那么,来回答你的第一个问题。如果添加了新属性或关系,则需要创建新的托管对象文件。如果您所做的只是修改预先存在的属性或关系上的某些选项,则旧的托管对象文件仍然有效


如果你还没有,你应该阅读苹果关于CoreData的所有文章。我还没有读过一本关于这个主题的书,书中的内容比他们的在线文档更好。我不知道这是否对Jon有帮助,但这是我见过的最好的答案。这确实帮助我解决了我自己的移民问题。谢谢,我感谢你的夸奖。我很高兴它帮助了一些人。我得承认苹果的核心数据文档很棒,特别是对于版本控制这个棘手的话题。如果你要执行轻量级迁移,一个非常重要的注意事项。确保未在应用程序委托的“ApplicationIDFinishLaunching”方法中初始化迁移。如果数据库包含大量数据,迁移可能需要一些时间。“didFinishLaunching”方法带有一个隐含的时间限制。如果您的应用程序未在该限制内完成启动,它将被iOS终止。链接已断开。这里是一个更新的链接。