在核心数据中进行大量迁移后尝试保存数据

Posted

技术标签:

【中文标题】在核心数据中进行大量迁移后尝试保存数据【英文标题】:Trying to save data after doing heavy weight migration in Core Data 【发布时间】:2014-03-11 16:13:50 【问题描述】:

我正在开发一个需要大量迁移的 ios 应用程序。我正在做的是将旧数据模型中的实体的属性类型转换为 Integer64 类型的新数据模型中的字符串类型。因为我正在更改属性的类型,所以这需要进行大量迁移。

现在,转换工作正常,但不幸的是,我在转换新实体后无法保存它,这就是为什么在迁移后启动应用程序时,我无法查看原来的数据使用旧数据模型输入。这是我正在使用的 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】:

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

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

【讨论】:

以上是关于在核心数据中进行大量迁移后尝试保存数据的主要内容,如果未能解决你的问题,请参考以下文章

不同模型之间的核心数据迁移?

以前的核心数据迁移失败

删除后尝试保存时核心数据崩溃

将大量数据保存到核心数据会导致应用程序因内存问题而终止

iOS - 核心数据 - 在 NSManagedObject 子类中使用删除方法后保存不成功

轻量级迁移核心数据