从string到整数的核心数据迁移16

我无法将商店实体属性从string迁移到整数16.下面是我采取的步骤:

  1. 添加模型版本…
  2. 在新模型中,将实体属性从string更改为Int 16。
  3. 在File Inspector> Versioned Core Data Model> Current Model中select新模型
  4. 为旧模型和新模型创build一个映射模型。

这是错误:

未解决的错误错误域= NSCocoaErrorDomain代码= 134140“操作无法完成。(Cocoa错误134140.)”UserInfo = 0xbd5cd20 {原因=无法find或自动推断映射模型迁移,destinationModel = …

映射模型在编译的.app文件中:

束

并在项目中:

在这里输入图像说明

迁移适用于像Integer 16> Integer 32这样的属性,或者在更改属性名称时使用。

我试图创build一个简单的核心数据项目和迁移工作自动(有和没有映射模型)从string到整数16和回。

最奇怪的部分是我试图寻找在程序包中的所有映射模型,没有find当前的源/目标模型。

发生这种情况是因为核心数据无法自动迁移您的属性。 这是因为它不能保证一个string总是适合int(即使你知道你的数据)。

所以你需要做的是使用映射模型。 以下是如何做到这一点:

  1. 在Xcode中,创build一个新的映射模型(文件>新build>新build文件),在核心数据部分select映射模型
  2. 在向导中select源模型和目标模型
  3. 这基本上把你放在与轻量级迁移相同的地方,一切都自动完成,除了你可以select重写一些映射。 具体来说就是那个给你烦恼的人。
  4. 创build一个新的映射策略类(Extend NSEntityMigrationPolicy
  5. 实现createDestinationInstancesForSourceInstance:entityMapping:manager:error:这将给你的源实例,所以你可以将该string转换为一个int并将其存储在新的商店。

你的代码应该是这样的:

 - (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)sInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error { NSManagedObject *newObject = [NSEntityDescription insertNewObjectForEntityForName:[mapping destinationEntityName] inManagedObjectContext:[manager destinationContext]]; // Copy all the values from sInstance into newObject, making sure to apply the conversion for the string to int when appropriate. So you should have one of these for each attribute: [newObject setValue:[sInstance valueForKey:@"xyz"] forKey:@"xyz"]; [manager associateSourceInstance:sInstance withDestinationInstance:newObject forEntityMapping:mapping]; } 
  1. 那么你所要做的就是在映射模型中设置该策略。 select映射模型文件,select适当的实体映射,并在右侧面板上设置CustomPolicy。

确保在初始化核心数据的任何位置更改迁移设置以删除自动types推断

 NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, nil]; 

那应该是…

对于那些在“无法find映射模型进行迁移”错误的数千矛中,这可能会有所帮助:

  1. 确保您在适当的文件夹/组中创build了映射文件(在按下Cmd + N之前 – 在项目导航器中select.xcdatamodeld文件)。
  2. 清理项目。
  3. 重build项目并运行。

在我的情况下,应用程序自动在干净/重build= \后find映射模型