在Core Data中进行重量级迁移后尝试保存数据

时间:2014-03-11 16:13:50

标签: ios core-data

我正在研究需要大量迁移的iOS应用程序。我正在做的是将我的旧数据模型中的实体的属性类型(Integer64类型)转换为新数据模型中的String类型。因为我正在更改属性的类型,所以这需要重量级迁移。

现在,转换工作正常,但遗憾的是我在转换后保存新实体时遇到问题,这就是为什么我在迁移后启动应用程序时,我无法查看到的数据使用旧数据模型输入。这是我正在使用的NSEntityMigrationPolicy的子类:

- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)sInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError *__autoreleasing *)error {

    NSManagedObject *newObject;
    NSEntityDescription *sourceInstanceEntity = [sInstance entity];
    NSManagedObjectContext *destMOC = [manager destinationContext];

    //correct entity?  just to be sure
    if ([[sourceInstanceEntity name] isEqualToString:@"MyEntity"]) {
        newObject = [NSEntityDescription insertNewObjectForEntityForName:@"MyEntity" inManagedObjectContext:destMOC];

        //obtain the attributes
        NSDictionary *keyValDict = [sInstance committedValuesForKeys:nil];
        NSDictionary *allAttributes = [[sInstance entity] attributesByName];

        //loop over the attributes
        for (NSString *key in allAttributes) {
            //get key and value
            id value = [sInstance valueForKey:key];
            if ([key isEqualToString:@"myAttribute"]) {
                //here retrieve old value
                NSNumber *oldValue = [keyValDict objectForKey:key];
                //here do conversion as needed
                NSString *newValue = [oldValue stringValue];
                //then store new value
                [newObject setValue:newValue forKey:key];
            }  else {
                //no need to modify the value, Copy it across
                [newObject setValue:value forKey:key];

            }

        }

        [manager associateSourceInstance:sInstance withDestinationInstance:newObject forEntityMapping:mapping];
        [destMOC save:error];
    }

    return YES;
}

- (BOOL) createRelationshipsForDestinationInstance:(NSManagedObject *)dInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError *__autoreleasing *)error {

    return YES;
}

我尽力做到尽可能彻底,我也已经完成了迁移过程,但不幸的是我无法弄清楚为什么我转换的实体没有保存在新数据中模型。我想指出一些可能是原因:

我正在转换/迁移的这个实体与其他4个实体有4个一对一的关系:一个关系有一个逆,其中三个关系没有逆。我知道不推荐没有逆的关系,但这就是原始数据模型的设计方式,不幸的是我无能为力。但是,这些关系不会以任何方式从我的旧数据模型更改为新的数据模型。我的方法是:

- (BOOL) createRelationshipsForDestinationInstance:(NSManagedObject *)dInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError *__autoreleasing *)error {

        return YES;
    }

现在必须改变以适应这个,从而允许我保存我的数据,或者我可以单独保留这个方法,并且仍然保存数据我只需更改方法:

- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)sInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError *__autoreleasing *)error {...}

并保持现有的关系,因为它们完好无损?

1 个答案:

答案 0 :(得分:0)

我通过将所有关系类型更改为在原始模型中具有反向关系来解决此问题,并在新模型中保持相同的结构。当我按原样使用上面的代码时,一切正常。

感谢所有考虑过这个问题的人。