gpt4 book ai didi

ios - 在核心数据中进行繁重的迁移后尝试保存数据

转载 作者:行者123 更新时间:2023-12-01 16:43:15 24 4
gpt4 key购买 nike

我正在开发需要大量迁移的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 {...}

并保持原有关系不变?

最佳答案

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

感谢所有考虑此问题的人。

关于ios - 在核心数据中进行繁重的迁移后尝试保存数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22330445/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com