17

我在将商店实体属性从 String 迁移到 Integer 16 时遇到问题。以下是我采取的步骤:

  1. 添加模型版本...
  2. 在新模型中,将 Entity 属性从 String 更改为 Int 16。
  3. 在 File Inspector > Versioned Core Data Model > Current Model 中选择新模型
  4. 为新旧模型创建映射模型。

这是错误:

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

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

捆

在项目中:

在此处输入图像描述

迁移适用于 Integer 16 > Integer 32 等属性,或更改属性名称时。

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

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

4

2 回答 2

23

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

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

  1. 在 Xcode 中,创建一个新的映射模型(File > New > New File),在 Core Data 部分选择 Mapping Model
  2. 在向导中选择源模型和目标模型
  3. 这基本上将您置于与轻量级迁移相同的位置,一切都是自动完成的,除了您可以选择覆盖某些映射。具体来说,就是给你带来麻烦的那个。
  4. 创建一个新的映射策略类(扩展NSEntityMigrationPolicy
  5. 实现createDestinationInstancesForSourceInstance:entityMapping:manager:error:它将为您提供源实例,以便您可以将该字符串转换为 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. 然后您所要做的就是在映射模型中设置该策略。选择映射模型文件,选择适当的实体映射并在右侧面板上设置 CustomPolicy。

请务必更改迁移设置以在启动 Core Data 的任何位置删除自动类型推断

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

应该是这样的...

于 2012-05-31T13:10:25.787 回答
1

对于那些因“找不到迁移映射模型”错误而打破数千条矛的人来说,这可能会有所帮助:

  1. 确保您在正确的文件夹/组中创建了映射文件(在按Cmd+之前 -在项目导航器中N选择.xcdatamodeld文件)。
  2. 清理项目。
  3. 重建项目并运行。

就我而言,应用程序在清理/重建后自动找到了映射模型 =\

于 2015-03-30T02:56:53.203 回答