Обнаружение миграции основных данных

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

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

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

Ответ 1

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

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);

Ответ 2

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