将数据插入核心数据时的奇怪行为

时间:2014-08-19 17:58:23

标签: ios objective-c iphone core-data core-data-migration

修改1 虽然我理解对于这个特定场景(和其他类似的场景)我可以单独使用映射编辑器来正确迁移我的存储,以便持久存储中的值不会跳转,但这不是我当前问题的解决方案,而只是避免解决问题的根源。我热衷于坚持使用自定义迁移策略,因为这样可以让我在迁移过程中获得很多控制权,特别是对于未来的设置自定义迁移策略对我来说很有意义。这是一个长期解决方案,而不仅仅是针对这种情况。

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

我真的很期待对此问题进行整理,并就我能解决这个问题的方法提出宝贵意见。

我做了什么: 我已设置迁移策略,以便可以将源数据从核心模型的version 1复制到新目标数据中{.1}}。

这是迁移政策:

version 2

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

以下是数据存储的版本1到版本2的比较。

版本1:正确 enter image description here

到版本2:现在正在错误地存储值。

Wrong values being saved into the database in the wrong fields

预期输出应将产品价格插入- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)sInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error { // Create the product managed object Product *newProductInstance = [NSEntityDescription insertNewObjectForEntityForName:[mapping destinationEntityName] inManagedObjectContext:[manager destinationContext]]; NSString *productCode = [sInstance valueForKey:@"productCode"]; NSNumber *productPrice = [sInstance valueForKey:@"productPrice"]; [newProductInstance setProductCode: productCode]; [newProductInstance setProductPrice:productPrice]; /** The previous old product entries didnt have anything for the last attribute, where as the new instances of product entity should have a default value of YES. */ [newProductInstance setProductPriceNeedsUpdating:[NSNumber numberWithBool:YES]]; /* 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; }) */ NSLog(@"Product description: %@", [newProductInstance description]); // Set up the association between the old source product and the new destination Product for the migration manager [manager associateSourceInstance:sInstance withDestinationInstance:newProductInstance forEntityMapping:mapping]; return YES; } 字段,而不应插入productPrice字段中,该字段实际上只应具有布尔值。 任何人都可以帮我理解我做错了什么,或者解释一下这里发生了什么?

更新1 - 这是我的ProductPriceNeedsUpdating

enter code here

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

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

我希望有人可以解决原始问题并告诉我为什么实体映射或更多属性映射未正确保存?

更新3 - EntityMapping和属性:

版本1 enter image description here

第2版 enter image description here

1 个答案:

答案 0 :(得分:0)

对于您的方案,不需要迁移策略。您只需使用映射模型并执行以下操作:

  1. 将不变实体相互映射。在映射模型编辑器中,应该说A productCode | $source.productCode之类的东西。这已经填好了。
  2. 要删除的属性(productPriceLastUpdated)根本不应出现,因为在创建映射模型时,您指定了源模型和目标模型。由于目标模型不包含此属性,因此不会显示。
  3. 如果显示新的布尔属性productPriceNeedsUpdating,请为“值表达式”输入“1”(这相当于@YES)。看起来应该是这样的:
    A productPriceNeedsUpdating | 1
  4. 现在只需调用

    ,而不是定义策略
    migrateStoreFromURL:type:options:withMappingModel:toDestinationURL:
    destinationType:destinationOptions:error
    

    只需使用映射模型编辑器即可完成非常复杂的操作。

    您的屏幕截图来自模型编辑器。确保熟悉映射编辑器