2010-06-11 3 views
19

Я успешно использую автоматическую легкую миграцию Core Data. Однако, когда определенный объект создается во время миграции, я хотел бы заполнить его некоторыми данными. Конечно, я мог проверить, пуста ли сущность каждый раз, когда приложение запускается, но это кажется неэффективным, когда Core Data имеет структуру миграции.Обнаружение легкого переноса данных основного ядра

Можно ли обнаружить, когда происходит легкая миграция (возможно, с использованием KVO или уведомлений) или требуется ли внедрение стандартных миграций?

Я пробовал использовать NSPersistentStoreCoordinatorStoresDidChangeNotification, но он не срабатывает, когда происходят миграции.

ответ

54

Для определения, требуется ли миграция, проверьте, чтобы увидеть, если управляемый объект модель постоянного хранилища координатора совместим с метаданными существующего магазина (адаптировано из компании Apple Is Migration Necessary):

NSError *error = nil; 
persistentStoreCoordinator = /* Persistent store coordinator */ ; 
NSURL *storeUrl = /* URL for the source store */ ; 

// Determine if a migration is needed 
NSDictionary *sourceMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType 
                          URL:storeUrl 
                         error:&error]; 
NSManagedObjectModel *destinationModel = [persistentStoreCoordinator managedObjectModel]; 
BOOL pscCompatibile = [destinationModel isConfiguration:nil compatibleWithStoreMetadata:sourceMetadata]; 
NSLog(@"Migration needed? %d", !pscCompatibile); 

Если pscCompatibile является NO, то миграция должна произойти. Для того, чтобы изучить изменения сущности, сравнить NSStoreModelVersionHashes ключ в словаре sourceMetadata к [destinationModel entities]:

NSSet *sourceEntities = [NSSet setWithArray:[(NSDictionary *)[sourceMetadata objectForKey:@"NSStoreModelVersionHashes"] allKeys]]; 
NSSet *destinationEntities = [NSSet setWithArray:[(NSDictionary *)[destinationModel entitiesByName] allKeys]]; 

// Entities that were added 
NSMutableSet *addedEntities = [NSMutableSet setWithSet:destinationEntities]; 
[addedEntities minusSet:sourceEntities]; 

// Entities that were removed 
NSMutableSet *removedEntities = [NSMutableSet setWithSet:sourceEntities]; 
[removedEntities minusSet:destinationEntities]; 

NSLog(@"Added entities: %@\nRemoved entities: %@", addedEntities, removedEntities); 
+1

+1 для обмена второй частью вашего ответа. – cocoafan

+0

@hadronzoo он всегда переносится, когда я запускаю приложение, не должен ли это делать только один раз? –

+0

@AhmedZ. нет, это просто происходит один раз –

1

насчет подклассов NSManagedObject для этого объекта, а затем отвергая -awakeFromInsert :? Или вы создаете этот объект в других частях вашего приложения?

Смежные вопросы