添加新版核心数据模型?

时间:2011-12-17 01:18:28

标签: iphone objective-c core-data nsmanagedobject

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

我现在有两个文件,Medical_Codes.xcdatamodelMedical_Codes_ 2.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;
}

1 个答案:

答案 0 :(得分:4)

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]) {
    ...
}

所以,回答你的第一个问题。如果添加了新属性或关系,则需要创建新的托管对象文件。如果您所做的只是修改了预先存在的属性或关系的一些选项,那么您的旧托管对象文件仍然有效。

如果您还没有,您应该阅读Apple撰写的有关CoreData的所有内容。我还没有读过一本关于这个主题的书,它比在线文档更好。特别是,请在versioning and migration上阅读他们的信息。