核心数据从String迁移到Integer 16

时间:2012-05-31 12:47:37

标签: ios core-data

我无法将商店实体属性从String迁移到Integer 16.以下是我采取的步骤:

  1. 添加模型版本......
  2. 在新模型中,将Entity属性从String更改为Int 16。
  3. 在文件检查器中选择新模型>版本化核心数据模型>当前模式
  4. 为旧模型和新模型创建映射模型。
  5. 运行
  6. 这是错误:

      

    未解决的错误错误域= NSCocoaErrorDomain代码= 134140“   操作无法完成。 (可可错误134140.)“   UserInfo = 0xbd5cd20 {reason =找不到或自动推断映射   迁移模型,destinationModel = ...

    映射模型存在于已编译的.app:

    Bundle

    并在项目中:

    enter image description here

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

    我尝试创建一个简单的核心数据项目,并且从String到Integer 16自动(有和没有映射模型)进行迁移。

    最奇怪的部分是我尝试以编程方式查找捆绑中的所有映射模型,但没有找到当前源/目标模型。

2 个答案:

答案 0 :(得分:21)

这是因为Core Data无法自动迁移您的属性。这是因为它不能保证字符串总是适合int(即使你知道你的数据也是如此)。

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

  1. 在Xcode中,创建一个新的映射模型(文件>新建>新文件),在核心数据部分选择映射模型
  2. 在向导中选择源模型和目标模型
  3. 这基本上使您与轻量级迁移处于同一个位置,一切都是自动完成的,除了您可以选择覆盖一些映射。特别是那个给你带来麻烦的那个。
  4. 创建新的映射政策类(扩展NSEntityMigrationPolicy
  5. 实现createDestinationInstancesForSourceInstance:entityMapping:manager:error:,它将为您提供源实例,以便您可以将该字符串转换为int并将其存储在新商店中。
  6. 您的代码应如下所示:

    - (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. 然后,您所要做的就是在映射模型中设置该策略。选择映射模型文件,选择适当的实体映射并在右侧面板上设置CustomPolicy。
    2. 请务必更改迁移设置,以便在初始化Core Data

      的任何位置删除自动类型推断
      NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, nil];
      

      那应该是它......

答案 1 :(得分:1)

对于那些经历了数以千计的长矛的人来说,无法找到迁移的映射模型"错误,这可能会有所帮助:

  1. 确保您在适当的文件夹/组中创建了映射文件(在按下 Cmd + N - 在项目导航器中选择 .xcdatamodeld 文件之前)。
  2. 清理项目。
  3. 重建项目并运行。
  4. 就我而言,app 自动在clean / rebuild = \

    之后找到了映射模型