2010-12-09 21 views
5

Uygulamam şu anda uygulama mağazasında bulunuyor ve veri modeline tek bir Ekleme Özniteliği ile güncelliyorum. Model versiyonunu ekledim ve güncel olarak ayarladım.Çekirdek Verileri hafif göç sorunu

Her şey çalışıyor, ancak eski bir sürüm üzerinden uygulamanın yeni bir sürümünü yüklemeyi test ettiğimde, uygulama hata iletisi olmadan yüklenemiyor. Cihazı yeniden başlatıncaya veya (XCode veya iTunes üzerinden) güncellenmiş uygulamayı tekrar yükleyene kadar başarısız olmaya devam edecek (sadece ekranda kısaca yanıp sönecek), ardından uygulama düzgün çalışıyor ve veriler düzgün bir şekilde taşındı.

Korkum, bu durum müşterilere olursa, uygulamayı yeniden yüklemeden önce silecek ve tüm verilerini kaybedecek. Herhangi bir fikir sahibi olan var mı? Eğer modelin önceki sürümüne herhangi bir değişiklik yapmaksızın emin

- (NSManagedObjectModel *)managedObjectModel { 
    if (managedObjectModel != nil) { 
     return managedObjectModel; 
    } 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"DataStore" ofType:@"momd"]; 
    NSURL *momURL = [NSURL fileURLWithPath:path]; 
    managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL]; 
    return managedObjectModel; 
} 
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 
    if (persistentStoreCoordinator != nil) { 
     return persistentStoreCoordinator; 
    } 
    NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"DataStore.sqlite"]; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    if (![fileManager fileExistsAtPath:storePath]) { 
     NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"DataStore" ofType:@"sqlite"]; 
     if (defaultStorePath) { 
      [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL]; 
     } 
    } 
    NSURL *storeUrl = [NSURL fileURLWithPath:storePath]; 
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], 
    NSMigratePersistentStoresAutomaticallyOption, 
    [NSNumber numberWithBool:YES], 
    NSInferMappingModelAutomaticallyOption, nil];  
    NSError *error; 
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]]; 
    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) { 
     // Update to handle the error appropriately. 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     exit(-1); // Fail 
    }   
    return persistentStoreCoordinator; 
} 

cevap

1

Are: Herhangi bir yardım Ben veri taşıma App Delegesi aşağıdaki kodu kullanıyorum

Teşekkür, takdir? Bu davranış, Çekirdek Veriler cihazda sahip olduğunuz kalıcı mağaza için bir model bulamıyor gibi geliyor.

Kalıcı mağazanızın eski bir sürümünü içeren uygulamayı başlattığınızda konsol günlüğünde herhangi bir Çekirdek Verisi hatasını görebilmeniz gerekir.

Ayrıca, yeni özniteliğinizi hangi noktada eklediniz? Eğer yeni sürümü oluşturmadan önce eklediyseniz, hem eski hem de yeni versiyonun özelliği olacaktır. Eski modelinizi kontrol edin ve yeni özelliğin orada olmadığından emin olun.

+0

Cevabınız için teşekkürler, veri modellerine tekrar baktım ve doğru görünüyor. Ayrıca önceki sürümüme geri döndüm ve yine aynı sonuçlarla yeni bir veri sürümü ekleme sürecine girdim. –

+0

Temel olarak ilk kez neden işe yaramayacağına dair bir öneriniz var mı, ancak ikinci kez başarılı bir geçişle iyi çalışıyor mu? İlk kez çalıştığından emin olmak için yapabileceğim bir şey olmalı, belki de orijinal veri modeli doğru bir şekilde okunmuyor mu? –

+0

Kesinlikle ilk kez çalışmak üzere tasarlanmıştır. İnşa ettiğim uygulamada bu tür bir geçişi sorunsuz olarak kullanıyorum. Yeni oluşturulan özniteliğin, geçiş gerçekleştiğinde düzgün şekilde başlatılmaması mümkün mü? yani, getirme yerine yerleştirme aşamasında olan bir değer beklediğinizi mi düşünüyorsunuz? Uygulamanızı eşleştirdikten sonra, geçişi denemek ve basit bir görünüm denetleyicisi görüntülemek dışında bir şey yapmazsınız. Taşıma işleminin kazaya neden olmasıyla veriye erişen bir şey gibi görünüyor. – DigitalBytes

1

Bu soruna da girdim. Bu değişiklikleri yapın, ben yapmak zorunda Tüm model versiyonu oldu

http://iphonedevelopment.blogspot.com/2009/09/core-data-migration-problems.html

: çekirdek veri bile basit taşımalara kesme yoktu kullanılarak oluşturulan varsayılan proje ama Jeff Lamarche bu yazı bana çalışma şeyler olsun yardımcı oldu ve kodu değiştirip çalıştı. Umarım yardımcı olur!

+0

Teşekkürler, ben bu göçü bir araya getirdiğimde ve yardım ettiğimde bahsettim. Açık olmak gerekirse, geçiş işe yarıyor, ancak bir nedenden dolayı uygulamayı başlatmak için iki kez uygulamayı yüklemem gerekiyor. –

0

Ayrıca, taşımanın çalışması için uygulamanızda kullanılabilen kaynak ve hedef şemalara da ihtiyacınız olduğunu unutmayın.

+0

Teşekkürler, evet ikisi de oradalar. Yine, taşıma özelliği yeni kullanılabilir özellik ile çalışır, ancak uygulamayı iki kez yüklemem veya uygulamayı başlatmak için cihazı sıfırlamam gerekir. –

İlgili konular