CoreData轻量级迁移+自定义



我试图归档一个轻量级迁移与一些处理之后。我已经完成了轻量级过程,现在我需要一些帮助来处理我的实体。

在旧模型中,我曾经有一个实体"Car",现在我添加了一个实体"Person",关系为Person has Cars。

因此,在轻量级迁移之后,我需要添加一个默认的人"John",并将所有的汽车添加到他。

有人有什么想法吗?

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreData.sqlite"];
    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    NSDictionary *options = @{
                              NSMigratePersistentStoresAutomaticallyOption : @YES,
                              NSInferMappingModelAutomaticallyOption : @YES
                              };

    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
    return _persistentStoreCoordinator;
}

您可以捕捉到是否要进行轻量级迁移。有关详细信息,请参阅此回答。在那里,您可以设置一个标志,并在正常启动后执行一个方法,在其中插入所需的实体。

但是请注意,轻量级迁移应该将所有现有实体迁移到新的存储版本,因此通常没有逻辑上令人信服的理由使用此钩子。相反,您只需查询(新版本或旧版本)存储是否包含"John"和他的汽车,如果不包含,则插入它们。

如果这是对数据库的一次性升级,那么使用自定义迁移策略类而不是轻量级迁移可能更有意义。这里有一个很好的教程来定制这个过程:http://9elements.com/io/index.php/customizing-core-data-migrations/

如果您希望将来自一对模型的推断迁移与另一对模型之间的自定义迁移混合在一起,我已经编写了有关Core Data方法的描述和示例迭代迁移类。

最新更新