我正在重写使用核心数据的iOS应用,但目前的对象模型已过时,并未真正反映当前版本的应用使用该模型的方式。例如,有几个实体代表颜色,我想简化为单个NSString属性*。
我知道轻量级迁移并不能解决这类问题,我也不确定是否可以对当前模型进行版本控制并使用手动迁移。是否更容易创建全新的Core Data模型,然后将所有现有项目手动迁移到新模型中? FWIW,通常少于100个项目,我的应用程序不使用iCloud同步,因此迁移到新模型应该相当快。
*我目前有一个具有色调,饱和度和亮度的实体,但我打算转到一个十六进制代码字符串(我现在只使用RGB颜色)。
答案 0 :(得分:0)
您可以创建新的模型版本,然后使用NSEntityMigrationPolicy将实体从一个模型版本转换为另一个模型版本。
定义新的数据模型版本,填写映射模型并在Custom Policy
NSEntityMigrationPolicy文件下设置。
有一篇帖子here可以帮助您开始实体迁移政策。 他们的例子是:
- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)inSourceInstance
entityMapping:(NSEntityMapping *)inMapping
manager:(NSMigrationManager *)inManager
error:(NSError **)outError
{
NSManagedObject *newObject;
NSEntityDescription *sourceInstanceEntity = [inSourceInstance entity];
if ( [[sourceInstanceEntity name] isEqualToString:@"Foo"] )
{
newObject = [NSEntityDescription insertNewObjectForEntityForName:@"Foo"
inManagedObjectContext:[inManager destinationContext]];
NSDictionary *keyValDict = [inSourceInstance committedValuesForKeys:nil];
NSArray *allKeys = [[[inSourceInstance entity] attributesByName] allKeys];
NSInteger i, max;
max = [allKeys count];
for (i=0 ; i< max ; i++)
{
// Get key and value
NSString *key = [allKeys objectAtIndex:i];
id value = [keyValDict objectForKey:key];
if ( [key isEqualToString:@"Bar"] )
{
[newObject setValue:[NSNumber numberWithBool:[value boolValue]] forKey:key];
}
else
[newObject setValue:value forKey:key];
}
}
[inManager associateSourceInstance:inSourceInstance
withDestinationInstance:newObject
forEntityMapping:inMapping];
return YES;
}
基本上你要做的是回顾keys
中的属性(sourceInstance
),在示例中称为“Foo”。 sourceInstance
是您当前具有色调,饱和度和亮度的实体。对于每个属性,执行你的魔法来创建“单个十六进制代码字符串”。此字符串将成为key
中newObject
的值。
在此post的末尾,有一个migrateIfNeeded
方法可以检查是否需要转换。 (不确定是否需要它或者你已经有了isNeeded逻辑)