2010-06-11 9 views
19

Ich verwende die automatische leichte Migration von Core Data erfolgreich. Wenn jedoch eine bestimmte Entität während einer Migration erstellt wird, möchte ich sie mit einigen Daten füllen. Natürlich könnte ich bei jedem Start der Anwendung überprüfen, ob die Entity leer ist, aber das scheint ineffizient zu sein, wenn Core Data über ein Migrations-Framework verfügt.Erkennen einer leichten Kerndatenmigration

Ist es möglich zu erkennen, wenn eine leichtgewichtige Migration auftritt (möglicherweise mit KVO oder Benachrichtigungen), oder erfordert dies die Implementierung von Standardmigrationen?

Ich habe versucht mit der NSPersistentStoreCoordinatorStoresDidChangeNotification, aber es wird nicht ausgelöst, wenn Migrationen auftreten.

Antwort

54

Um festzustellen, ob eine Migration benötigt wird, prüfen Sie, ob die persistente Objektmodell verwaltet den Speicher-Koordinator mit den vorhandenen Speicher Metadaten (angepasst von Apples Is Migration Necessary) kompatibel ist:

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

Wenn pscCompatibileNO ist, dann Eine Migration muss stattfinden. Um die Einheit Veränderungen zu untersuchen, vergleichen Sie die NSStoreModelVersionHashes Schlüssel im sourceMetadata Wörterbuch zum [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 für den zweiten Teil Ihrer Antwort zu teilen. – cocoafan

+0

@hadronzoo es migriert immer, wie ich die Anwendung starte, sollte es nicht nur einmal getan werden? –

+0

@AhmedZ. Nein, es passiert nur einmal –

1

Was Subklassen NSManagedObject für diese Entität, und dann überschrieben -awakeFromInsert :? Oder erstellen Sie diese Entität in anderen Teilen Ihrer App?

Verwandte Themen