NSEntityMigrationPolicy创建新对象而不是更改现有对象

时间:2016-08-02 07:13:42

标签: ios objective-c core-data

我使用NSEntityMigrationPolicycreateDestinationInstancesForSourceInstance方法将一种属性类型从Data更改为String。但是它会创建新对象而不是替换现有对象。

这是我的代码:

#import "MessageTransformationPolicy.h"

@implementation MessageTransformationPolicy

- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)sInstance
                                      entityMapping:(NSEntityMapping *)mapping
                                            manager:(NSMigrationManager *)manager
                                              error:(NSError **)error
{
    // Create a new object for the model context
    NSManagedObject *newObject =
    [NSEntityDescription insertNewObjectForEntityForName:[mapping destinationEntityName]
                                  inManagedObjectContext:[manager destinationContext]];

    // do our transfer of nsdate to nsstring
    NSData *messageMetadata_dataType = [sInstance valueForKey:@"metadata"];
    NSString *messageMetadata_stringType = [[NSString alloc] initWithData:messageMetadata_dataType encoding:NSUTF8StringEncoding];

    // set the value for our new object
    [newObject setValue:messageMetadata_stringType forKey:@"metadata"];

    // do the coupling of old and new
    [manager associateSourceInstance:sInstance withDestinationInstance:newObject forEntityMapping:mapping];

    return YES;
}

@end

问题出在哪里?

1 个答案:

答案 0 :(得分:0)

通过更改存储和保存名为Msg的目标实体的所有属性的方式,解决了问题:

- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)inSourceInstance
                                      entityMapping:(NSEntityMapping *)inMapping
                                            manager:(NSMigrationManager *)inManager
                                              error:(NSError **)outError {
    NSManagedObject *newObject;
    NSEntityDescription *sourceInstanceEntity = [inSourceInstance entity];

    // sure to have the right entity
    if ( [[sourceInstanceEntity name] isEqualToString:@"Msg"] ) {
        newObject = [NSEntityDescription insertNewObjectForEntityForName:@"Msg" inManagedObjectContext:[inManager destinationContext]];

        // get the attributes
        NSDictionary *keyValDict = [inSourceInstance committedValuesForKeys:nil];
        NSArray *allKeys = [[[inSourceInstance entity] attributesByName] allKeys];
        // loop over the attributes
        for (NSString *key  in allKeys) {
            // Get key and value
            id value = [keyValDict objectForKey:key];
            if ( [key isEqualToString:@"metadata"] ) {                
                NSData *messageMetadata_dataType = [keyValDict valueForKey:@"metadata"];
                NSString *messageMetadata_stringType = [[NSString alloc] initWithData:messageMetadata_dataType encoding:NSUTF8StringEncoding];

                [newObject setValue:messageMetadata_stringType forKey:key];
            } else { 
                [newObject setValue:value forKey:key];
            }
        }

        [inManager associateSourceInstance:inSourceInstance  withDestinationInstance:newObject forEntityMapping:inMapping];
    }
    return YES;
}
相关问题