关于iphone:添加新版本的核心数据模型?

Adding new version of core data model?

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

我现在有两个文件,Medical_Codes.xcdatamodelMedical_Codes_ 2.xcdatamodel

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
- (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 复制到您的包中,模型管理器使用它进行必要的迁移。

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

1
2
3
4
5
6
7
8
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 的所有内容。我还没有读过一本比他们的在线文档更好地涵盖该主题的书。特别是,阅读他们关于版本控制和迁移的信息。