Ответ 1
Это происходит потому, что Core Data не может автоматически перенести ваш атрибут. Это связано с тем, что он не может гарантировать, что строка всегда будет соответствовать int (даже если вы знаете, что ваши данные).
Итак, вам нужно использовать модель сопоставления. Вот как это сделать:
- В Xcode создайте новую модель сопоставления (File > New > New File), выберите Mapping Model в разделе Core Data.
- Выберите исходный и целевой модели в мастере
- Это в основном помещает вас в то же самое место, что и облегченная миграция, все делается автоматически, за исключением того, что вы можете переопределить какое-либо сопоставление. В частности, тот, который дает вам неприятности.
- Создайте новый класс политики сопоставления (Extend
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 Datap >
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, nil];
Это должно быть...