2010-06-11 27 views
19

Używam automatycznej, lekkiej migracji danych Core Data. Jednak gdy konkretny obiekt zostanie utworzony podczas migracji, chciałbym wypełnić go pewnymi danymi. Oczywiście mogę sprawdzić, czy obiekt jest pusty przy każdym uruchomieniu aplikacji, ale wydaje się to nieefektywne, gdy Core Data ma strukturę migracji.Wykrywanie lekkiej migracji podstawowych danych

Czy można wykryć, kiedy występuje niewielka migracja (prawdopodobnie przy użyciu KVO lub powiadomień), czy też wymaga to wdrożenia standardowych migracji?

Próbowałem już używać NSPersistentStoreCoordinatorStoresDidChangeNotification, ale nie uruchamia się, gdy występują migracje.

Odpowiedz

54

Aby wykryć, czy migracja jest potrzebna, należy sprawdzić, czy udało model obiektowy w trwałego magazynu koordynatora jest kompatybilny z metadanych istniejącego sklepu (dostosowany od 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); 

Jeśli pscCompatibile jest NO, a następnie konieczna będzie migracja. Aby zbadać zmiany podmiotu porównać klucz w słowniku sourceMetadataNSStoreModelVersionHashes do [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 za udostępnienie drugiej części odpowiedzi. – cocoafan

+0

@hadronzoo migruje zawsze, gdy uruchamiam aplikację ,, nie powinienem "robić tego tylko raz? –

+0

@AhmedZ. nie, to się dzieje raz –

1

Co instacji NSManagedObject dla tego podmiotu, a następnie przesłanianie -awakeFromInsert :? A może tworzysz ten byt w innych częściach swojej aplikacji?

Powiązane problemy