属性映射不正确关联。 为什么?

编辑1虽然我明白,对于这个特定的场景(和其他类似),我可以单独使用映射编辑器正确地迁移我的商店,以便永久性存储中的值不会跳过,但这不是解决我当前的问题但只能避免解决问题的根源。 我热衷于坚持我的定制迁移政策,因为这将通过迁移过程给我很大的控制权,特别是对于未来的情况而言,制定自定义迁移政策对我来说是非常有用的。 这是一个长期的解决scheme,而不仅仅是针对这种情况。

我恳请您尝试帮助我解决目前的状况,而不是将我转移到轻量级迁移,或者build议我避免使用迁移政策。 谢谢。

我真的很期待把这个问题整理出来,并且提出宝贵的意见和build议,以便我能够解决这个问题。

我所做的:我设置了迁移策略,以便可以将源数据复制到从核心模型的version 1version 2的目标数据中。

这是移民政策:

 - (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)sInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error { // Create the product managed object NSManagedObject *newObject = [NSEntityDescription insertNewObjectForEntityForName:[mapping destinationEntityName] inManagedObjectContext:[manager destinationContext]]; NSString *productCode = [sInstance valueForKey:@"productCode"]; NSNumber *productPrice = [sInstance valueForKey:@"productPrice"]; [newObject setValue:productCode forKey:@"productCode"]; [newObject setValue:productPrice forKey:@"productPrice"]; //This is the field where the name has changed as well as the type. [newObject setValue:[NSNumber numberWithBool:YES] forKey:@"productPriceNeedsUpdating"]; // Set up the association between the old source product and the new destination Product for the migration manager [manager associateSourceInstance:sInstance withDestinationInstance:newObject forEntityMapping:mapping]; /* A test statement to make sure the destination object contains the correct values int he right properties: Product description: <NSManagedObject: 0xb983780> (entity: Product; id: 0xb9837b0 <x-coredata:///Product/t97685A9D-09B4-475F-BDE3-BC9176454AEF6> ; data: { productCode = 9999; productPrice = "2.09"; productPriceNeedsUpdating = 1; }) */ // Set up the association between the old source product and the new destination Product for the migration manager return YES; } 

因此,即使被testing的属性在运行时显示正确的值,保存在数据模型存储区中的结果值也不正确,如快照中所示。

这里是从数据存储的版本1到版本2的比较。

版本1:正确 在这里输入图像说明

到版本2:现在正在存储值的不正确。

将错误值保存到数据库的错误字段中

预期的输出应该将product价格插入到productPrice字段中,而不是ProductPriceNeedsUpdating字段中,该字段实际上只应具有布尔值。 任何人都可以帮助我理解我做错了什么,或者解释这里发生了什么?

更新1 – 这是我的entity mappings

在此处输入代码

更新2 – 20 / Aug / 2014 01:02 GMT

当我从版本1中删除types为date的属性ProductPriceLastUpdated ,并在版本2中删除booleantypes的ProductPriceNeedsUpdate属性时,只留下两个都在版本1和2中匹配的属性,那么一切正常。 即使我可以留在这里继续前进,我不能忽略当前正在使用数据库版本1的用户,这些用户没有那个毫无意义的ProductPriceLastUpdated属性,我需要将该types转换为布尔值,并将名称更改为ProductPriceNeedsUpdate 。 这就是当事情开始变得怪异,价格值显示在ProductPriceNeedsUpdate字段而不是productPrice字段。

我希望有人可以解决原来的问题,并告诉我为什么这是entityMapping,或更多,所以,属性映射不能正确保存?

更新3 – EntityMapping和属性:

版本1 在这里输入图像说明

版本2 在这里输入图像说明

有任何想法吗?

首先,如果您只想使用轻量级迁移(在这种情况下您应该这么做),则可以摆脱自定义迁移策略。 在这种情况下,这是不需要的。 而且,事实上,您也可以摆脱您的自定义映射模型。 您只需在版本2模型中selectproductPriceNeedsUpdating布尔型标志,然后在右侧的属性详细信息检查器中将缺省值设置为YES 。 这将实现您尝试使用自定义迁移策略的目标。

但是,如果您确实需要使用自定义迁移策略编写代码,那么我仍然不会使用自定义代码。 您只能使用映射模型来实现此迁移。 只需selectProductToProduct映射,然后在productNeedsUpdating的值expression式中inputYES1

编辑

因此,经过相当长的屏幕分享之后,确定迁移是使用Marcus Zarra的核心数据手册中描述的逐步迁移商店的代码。 当写入时,WAL模式不是Core Data的默认模式。 当启用WAL模式时,逐步迁移的存储不能正常运行,因为还有两个文件需要处理,即预先写入日志和共享内存文件。 当简单地用新的商店replace旧商店,而不先删除这些文件,奇怪的事情发生,如在这篇文章中描述。 该解决scheme最终最终是为了逐步迁移场景禁用WAL模式,所以额外的文件不是首先生成的。