核心数据重命名属性 "deleted"

Core Data rename attribute "deleted"

我正在使用映射模型迁移数据模型。

一个实体有一个名为 deleted 的属性,该属性不会迁移,因为 Core Data 使用 deleted 属性 NSManagedObject 而不是我的。

如何强制映射模型使用我的属性?

我可以在值表达式中使用什么吗?这是我现在使用的:

谢谢。

不幸的是你使用了一个保留字(我怀疑它当时产生了警告)。

您最好的选择是进行轻量级迁移,该值将 迁移。然后在迁移之后;遍历数据并手动更新每个对象的值。您只需执行一次,因为一旦迁移完成,旧的保留字 属性 将消失。

我找到了解决方案:

我实现了一个自定义 MigrationPolicy,如下所示:

- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)sourceInstance
                                  entityMapping:(NSEntityMapping *)mapping
                                        manager:(NSMigrationManager *)manager
                                          error:(NSError *__autoreleasing *)error
{
    NSManagedObject *newObject = [NSEntityDescription insertNewObjectForEntityForName:[mapping destinationEntityName] inManagedObjectContext:[manager destinationContext]];

    // Add the old 'deleted' attribute to a renamed attribute
    [newObject setValue:[NSNumber numberWithBool:[((OldEntityModel *)sourceInstance) deleted]] forKey:@"newDeletedAttribute"];

    // Add all the other attributes
    [newObject setValue:[sourceInstance valueForKey:@"field1"] forKey:@"field1"];
    [newObject setValue:[sourceInstance valueForKey:@"field2"] forKey:@"field2"];

    // Add the relationships
    NSSet *relationshipAttribute = [[NSSet alloc] initWithArray:[manager destinationInstancesForEntityMappingNamed:@"OtherEntityToOtherEntity" sourceInstances:@[[sourceInstance valueForKey:@"relationshipAttribute"]]]];
    [newObject relationshipAttribute forKey:@"relationshipAttribute"];

    [manager associateSourceInstance:sourceInstance withDestinationInstance:newObject forEntityMapping:mapping];

    return YES;
}

sourceEntity 转换为旧模型版本允许访问在轻量级迁移或映射模型中无法访问的 deleted 属性。