核心数据 - 迁移问题?

时间:2011-04-13 23:31:27

标签: iphone objective-c core-data mapping-model core-data-migration

我正在尝试迁移

我有两个版本的模型

1.xcdatamodel
2.xcdatamodel

我创建了从版本1到2的映射模型

1to2.xcmappingmodel

问题是它无法找到我创建的迁移模型,因此mappingModel始终为nil。 有什么我需要做的来指定它可以使用哪个mappingModel?

target = [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:modelPath]];
//target and source are initialized correctly
mappingModel = [NSMappingModel mappingModelFromBundles:nil forSourceModel:source destinationModel:target];

4 个答案:

答案 0 :(得分:5)

创建映射模型后,可能是您更改了其中一个模型。

即使更改似乎不相关,它也会更改用于查找适当映射模型的模型的哈希值。 至少我刚刚被这种方式所困扰: - )

答案 1 :(得分:4)

如果您已经创建了从1.xcdatamodel到2.xcdatamodel的映射模型并正确配置它,那么您应该可以执行以下操作:[注意:关键是指定 NSMigratePersistentStoresAutomaticallyOption

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
    {
    if (persistentStoreCoordinator)
        return persistentStoreCoordinator;

    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"MyStore.sqlite"]];

    NSError *error = nil;
   persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];

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

   if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
                                        configuration:nil
                                        URL:storeUrl
                                        options:options
                                        error:&error])
        {
        // Handle error
        NSLog(@"Error adding persistent store...%@", error);
        // Handle the error. 
        NSLog(@"Failed to save to data store: %@", [error localizedDescription]);
        NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey];
        if(detailedErrors != nil && [detailedErrors count] > 0)
            {
            for(NSError* detailedError in detailedErrors)
                {
                NSLog(@"  DetailedError: %@", [detailedError userInfo]);
                }
            }
        else
            {
            NSLog(@"  %@", [error userInfo]);
            }

        }
    else
        {
        DLog(@"Persistent store added without incident, apparently.");
        }

    return persistentStoreCoordinator;
    }

答案 2 :(得分:0)

要回答原始问题,您的代码看起来不错,但我不是为什么你传递nil作为bundles参数。文档没有说可以。所以:

NSArray *theBundles = [NSArray arrayWithObject:[NSBundle mainBundle]];
    mappingModel = [NSMappingModel mappingModelFromBundles:theBundles
                                            forSourceModel:source 
                                          destinationModel:target];

答案 3 :(得分:0)

如果你传递nil作为bundle参数,它将需要[NSBundle mainBundle]。

[回答Elise van Looij的问题]