2012-03-20 12 views
9

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.

+0

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

+0

Otomatik geçiş özellikleri/sağlamlığı 10.5'ten sonra eklediğimi tahmin ediyorum ... – nielsbot

+0

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. –

cevap

1

Bu% 100'lük bir sorunla ilgili değil, ancak Apple tarafından 10.6 ile uyumlu olması gereken ve ayrıca 10.5 ile uyumlu olması gereken Core Data modellerinin nasıl taşınacağıyla ilgili bir geçici çözüm var. 10.5'de bir yöntemin eksik olduğu ve 10.6'nın göç için geçerli olduğu anlaşılmaktadır.

destinationInstancesForSourceRelationshipNamed:sourceInstances:

eksik yöntemdir.

Umarım bu yardımcı olur.

Referans: http://developer.apple.com/library/mac/#/legacy/mac/library/releasenotes/Cocoa/MigrationCrashBuild106Run105/_index.html

+0

Cevabınız için teşekkürler. Bu uygulamanın en yeni sürümü için 10.6’ya gereksinim duyduk. Bu yüzden artık sorun değil. Her halükârda, bunun aynı problem olduğunu sanmıyorum, 10.5’te inşa ederken bile bunu gördüm. Bu arada, gönderdiğiniz link aslında çalışmıyor. Bu sadece Apple'ın geliştirici dokümantasyon arama sayfasına gider. –

+1

Fotoğraf çekmeye değerdi. Bağlantının neden çalışmadığından emin değilim. Google’ın "Çekirdek Veri Aktarımı 10.5 10.6", Apple’ın belgelerine uygun bağlantıyı getiriyor. – macandyp