10.5 Leopard ve üzerini hedefleyen NSPersistentDocument tabanlı bir Çekirdek Veriler uygulamasına sahibim. Veri modelinde değişiklikler yapan bir güncelleme yayınlamak üzereyim ve bu nedenle var olan belgeleri yeni modele geçirmem gerekiyor. Değişiklikler nispeten basit ve onlar için bir eşleme modeli oluşturdum. Otomatik hafif göç yapmayı denemediğimi unutmayın, bir eşleme modelim var (Leopard üzerinde hafif bir geçiş desteklenmiyor, ancak benim modelim de bunu değiştiriyor). aşağıdaki gibi benim NSPersistentDocument alt sınıfında, ben -configurePersistentStoreCoordinatorForURL...
geçersiz: Bu 10.6 ve 10.7 üzerinde çalışıyorOtomatik Çekirdek Veri taşıma işlemi Mac OS X 10.5'te başarısız oluyor ancak 10.6 veya 10.7 üzerinde değil
- (BOOL)configurePersistentStoreCoordinatorForURL:(NSURL *)url
ofType:(NSString *)fileType
modelConfiguration:(NSString *)configuration
storeOptions:(NSDictionary *)storeOptions
error:(NSError **)error
{
NSMutableDictionary *newOptions = (storeOptions ?
[NSMutableDictionary dictionaryWithDictionary:storeOptions] :
[NSMutableDictionary dictionary]);
[newOptions setObject:(id)kCFBooleanTrue forKey:NSMigratePersistentStoresAutomaticallyOption];
return [super configurePersistentStoreCoordinatorForURL:url
ofType:fileType
modelConfiguration:configuration
storeOptions:newOptions
error:error];
}
. Ancak, 10.5, [super configurePersistentStore...]
çağrısı bir istisna atar ve başarısız olur. hatadır:
Error Domain=NSCocoaErrorDomain Code=134020 UserInfo=0x15812d70 "The model configuration used to open the store is incompatible with the one that was used to create the store."
yerine bu kodu kullanarak, elle göç başlatırsanız:
NSArray *bundles = [NSArray arrayWithObject:[NSBundle mainBundle]];
NSManagedObjectModel *sourceModel = [NSManagedObjectModel mergedModelFromBundles:bundles forStoreMetadata:sourceMetadata];
NSManagedObjectModel *destinationModel = [psc managedObjectModel];
NSMappingModel *mappingModel = [NSMappingModel mappingModelFromBundles:bundles forSourceModel:sourceModel destinationModel:destinationModel];
NSMigrationManager *migrationManager = [[[NSMigrationManager alloc] initWithSourceModel:sourceModel destinationModel:destinationModel] autorelease];
BOOL migrationSuccessful = [migrationManager migrateStoreFromURL:backupURL
type:NSXMLStoreType
options:storeOptions
withMappingModel:mappingModel
toDestinationURL:url
destinationType:NSXMLStoreType
destinationOptions:storeOptions
error:error];
return [psc addPersistentStoreWithType:NSXMLStoreType configuration:configuration URL:url options:storeOptions error:error] != nil;
göç Tamam çalışır. Ancak, daha temiz bir kod oluşturduğundan başka bir sebepten ötürü otomatik geçişi kullanmayı tercih ederim. 10.6+ üzerinde çalışan ancak 10.5'te olmayan otomatik geçişle benzer bir sorun görüldü mü? Önsezim, yerleşik göç kodunun bazı nedenlerle eşleme modelini bulamaması gibi oldukça basit bir şey olduğu, ancak ne olması gerektiğini anlayamıyorum.
Aynı problem ve çözüme sahip oldum (o zaman pazarlama borçları OS X 10.5'i desteklemeyi durdurdu, böylece manuel taşıma kodunu kaldırdım). – cdelacroix
Otomatik geçiş özellikleri/sağlamlığı 10.5'ten sonra eklediğimi tahmin ediyorum ... – nielsbot
Eminim ki onlar var, ama başarısız olmasını bekleyecek kadar karmaşık bir şey yapmıyorum. Her neyse, bir sonraki sürümde, bu uygulama sadece 10.6+ olacak, bu yüzden artık bir sorun değil ve mevcut manuel taşıma kodunu bir noktada kaldıracağım. Yine de bunun neden olduğunu bilmek güzel olurdu. –