发生这种情况是因为 Core Data 无法自动迁移您的属性。这是因为它不能保证字符串总是适合 int (即使您知道您的数据确实如此)。
所以你需要做的是使用映射模型。这是如何做到的:
- 在 Xcode 中,创建一个新的映射模型(File > New > New File),在 Core Data 部分选择 Mapping Model
- 在向导中选择源模型和目标模型
- 这基本上将您置于与轻量级迁移相同的位置,一切都是自动完成的,除了您可以选择覆盖某些映射。具体来说,就是给你带来麻烦的那个。
- 创建一个新的映射策略类(扩展
NSEntityMigrationPolicy
)
- 实现
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];
}
- 然后您所要做的就是在映射模型中设置该策略。选择映射模型文件,选择适当的实体映射并在右侧面板上设置 CustomPolicy。
请务必更改迁移设置以在启动 Core Data 的任何位置删除自动类型推断
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, nil];
应该是这样的...