CoreData轻量级迁移+自定义

时间:2013-05-09 01:47:28

标签: objective-c core-data core-data-migration

我正在尝试存档轻量级迁移,然后进行一些处理。我已经完成了轻量级过程,现在我需要一些帮助来处理我的实体。

在旧模型上,我曾经有一个实体“Car”,现在我添加了实体“Person”,其中包含Person have 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;
}

2 个答案:

答案 0 :(得分:2)

如果要进行轻量级迁移,您可以捕获。有关详细信息,请参阅this答案。在那里,您可以设置一个标志,并在此基础上执行正常启动后插入所需实体的方法。

请注意,轻量级迁移应该将所有现有实体迁移到新的商店版本,因此通常没有逻辑上令人信服的理由来使用此挂钩。相反,如果它包含“John”和他的汽车,那么你只需要查询你的(新旧版本)商店,如果没有,则将其插入。

答案 1 :(得分:0)

如果这是对数据库的一次性升级,则使用custom migration policy class而不是轻量级迁移可能是有意义的。这是一个关于自定义该过程的好教程: http://9elements.com/io/index.php/customizing-core-data-migrations/

如果您希望将来自一对模型的推断迁移与另一对模型之间的自定义迁移混合,我写了一个description of the Core Data methods involved并示例iterative migration class