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

Ios 属性映射未正确关联。为什么?,ios,objective-c,core-data,ios7,core-data-migration,Ios,Objective C,Core Data,Ios7,Core Data Migration,编辑1 虽然我知道对于这个特定场景(以及其他类似场景),我可以单独使用映射编辑器来正确迁移我的存储,这样持久存储中的值就不会跳转,但这并不能解决我当前的问题,而只能避免解决问题的根源。我热衷于坚持我的自定义迁移策略,因为这将在迁移过程中给我很大的控制权,特别是在将来的场景中,设置自定义迁移策略将对我起作用。这是一个长期的解决方案,而不仅仅是这个场景 我敦促您尝试帮助我解决当前的情况,而不是将我转移到轻量级迁移或建议我避免使用迁移策略。多谢各位 我真的很期待整理这件事,以及你关于我能做些什么来解决

编辑1 虽然我知道对于这个特定场景(以及其他类似场景),我可以单独使用映射编辑器来正确迁移我的存储,这样持久存储中的值就不会跳转,但这并不能解决我当前的问题,而只能避免解决问题的根源。我热衷于坚持我的自定义迁移策略,因为这将在迁移过程中给我很大的控制权,特别是在将来的场景中,设置自定义迁移策略将对我起作用。这是一个长期的解决方案,而不仅仅是这个场景

我敦促您尝试帮助我解决当前的情况,而不是将我转移到轻量级迁移或建议我避免使用迁移策略。多谢各位

我真的很期待整理这件事,以及你关于我能做些什么来解决这个问题的宝贵意见

我所做的: 我设置了迁移策略,以便可以将源数据从核心模型的
version 1
复制到
version 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;
}
-(BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject*)站实体映射:(NSEntityMapping*)映射管理器:(NSMigrationManager*)管理器错误:(NSError**)错误{
//创建产品管理对象
NSManagedObject*newObject=[NSEntityDescription insertNewObjectForEntityForName:[映射destinationEntityName]
inManagedObjectContext:[manager destinationContext]];
NSString*productCode=[sInstance valueForKey:@“productCode”];
NSNumber*productPrice=[sInstance valueForKey:@“productPrice]”;
[newObject setValue:productCode forKey:@“productCode”];
[newObject setValue:productPrice forKey:@“productPrice”];
//这是名称和类型已更改的字段。
[newObject setValue:[NSNumber numberWithBool:YES]forKey:@“ProductPriceNeedSupdated”];
//为迁移管理器设置旧源产品和新目标产品之间的关联
[manager associateSourceInstance:sinInstance with DestinationInstance:newObject forEntityMapping:mapping];
/* 
一个测试语句,用于确保目标对象包含正确的
右属性中的值:
产品描述:(实体:产品;id:0xb9837b0;数据:{
产品代码=9999;
productPrice=“2.09”;
ProductPriceNeedsUpdated=1;
})
*/
//为迁移管理器设置旧源产品和新目标产品之间的关联
返回YES;
}
因此,即使测试的属性在运行时显示正确的值,保存在数据模型存储中的结果值也不正确,如快照中所示

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

版本1:正确

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

预期输出应将产品价格插入到
productPrice
字段中,而不是插入到
productpriceneedsupdated
字段中,该字段实际上应该只有布尔值。 谁能帮我理解我做错了什么,或者解释一下这里发生了什么

更新1-以下是我的
实体映射

更新2-20/aug/2014 01:02 GMT

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

我希望有人能解决最初的问题,并告诉我为什么entityMapping,或者更确切地说,属性映射没有正确保存

更新3-实体映射和属性:

版本1

版本2


有什么想法吗?

首先,如果您只想使用轻量级迁移(在本例中您确实应该这样做),您可以放弃自定义迁移策略。在这种情况下,它是不需要的。事实上,您也可以摆脱自定义映射模型。您只需在版本2模型中选择
productpriceneedsupdated
布尔标志,然后在右侧的属性详细信息检查器中,将默认值设置为
YES
。这将实现您通过自定义迁移策略试图达到的目标

但是,如果您真的需要使用自定义迁移策略在代码中编写此代码,我仍然不会使用自定义代码。您只需使用映射模型即可实现此迁移。只需选择ProductToProduct映射,然后在ProductNeedsUpdate的值表达式中,输入
YES
1

编辑

因此,在相当长的屏幕共享之后,确定迁移使用了Marcus Zarra的核心数据书中描述逐步迁移存储的代码。编写时,WAL模式不是包含核心数据的默认模式。启用WAL模式时,渐进迁移存储无法正常运行,因为还有两个文件需要处理:预写日志和共享M