Mağazayı açmak için kullanılan model, mağazayı oluşturmak için kullanılan modelle uyumsuz


181

Xcode 3.2'de bir Core Data modeli oluşturdum ve Xcode 4.2'de yükselttikten sonra NSManagedObject alt sınıfının yeni bir varlığını ekledim (yeni varlığa bakın).

İlk olarak, garip görünüyor çünkü eskisiyle aynı grupta değil. İşte benim xcode 4.2 resim (AlkitabDB xcode 3.2 oluşturulan bir, EndeDB geçerli xcode sürümü (4.2) yeni olan:

yeni varlık xdatamodelde gruplanmamış

İkinci şey, olduğu gibi izin verdim, sonra ikinci varlığa (yeni olana) ilk varlıkla (eski) aynı şekilde eriştim ve başlıklı hata görünür.

İşte hata:

2012-01-16 21:13:38.496 iHuria[55953:207] Unresolved error Error Domain=NSCocoaErrorDomain Code=134100 "The operation couldn’t be completed. (Cocoa error 134100.)" UserInfo=0x8829cd0 {metadata=<CFBasicHash 0x882a370 [0x1839b38]>{type = immutable dict, count = 7,
entries =>
    2 : <CFString 0x8829b90 [0x1839b38]>{contents = "NSStoreModelVersionIdentifiers"} = <CFArray 0x8829ff0 [0x1839b38]>{type = immutable, count = 0, values = ()}
    4 : <CFString 0x8829bc0 [0x1839b38]>{contents = "NSPersistenceFrameworkVersion"} = <CFNumber 0x8829770 [0x1839b38]>{value = +320, type = kCFNumberSInt64Type}
    6 : <CFString 0x8829bf0 [0x1839b38]>{contents = "NSStoreModelVersionHashes"} = <CFBasicHash 0x882a080 [0x1839b38]>{type = immutable dict, count = 1,
entries =>
    0 : <CFString 0x882a010 [0x1839b38]>{contents = "AlkitabDB"} = <CFData 0x882a030 [0x1839b38]>{length = 32, capacity = 32, bytes = 0xd02ac5f8be6ab0b39add450aca202ac0 ... 3d45d462998d2ccd}
}

    7 : <CFString 0x10e3aa8 [0x1839b38]>{contents = "NSStoreUUID"} = <CFString 0x8829e60 [0x1839b38]>{contents = "4F2EE7FF-463B-4055-BBED-8E603CDBDF59"}
    8 : <CFString 0x10e3948 [0x1839b38]>{contents = "NSStoreType"} = <CFString 0x10e3958 [0x1839b38]>{contents = "SQLite"}
    9 : <CFString 0x8829c40 [0x1839b38]>{contents = "NSStoreModelVersionHashesVersion"} = <CFNumber 0x6b1c7c0 [0x1839b38]>{value = +3, type = kCFNumberSInt32Type}
    10 : <CFString 0x8829c70 [0x1839b38]>{contents = "_NSAutoVacuumLevel"} = <CFString 0x882a0c0 [0x1839b38]>{contents = "2"}
}
, reason=The model used to open the store is incompatible with the one used to create the store}, {
    metadata =     {
        NSPersistenceFrameworkVersion = 320;
        NSStoreModelVersionHashes =         {
            AlkitabDB = <d02ac5f8 be6ab0b3 9add450a ca202ac0 ebd1e860 cbb578c2 3d45d462 998d2ccd>;
        };
        NSStoreModelVersionHashesVersion = 3;
        NSStoreModelVersionIdentifiers =         (
        );
        NSStoreType = SQLite;
        NSStoreUUID = "4F2EE7FF-463B-4055-BBED-8E603CDBDF59";
        "_NSAutoVacuumLevel" = 2;
    };
    reason = "The model used to open the store is incompatible with the one used to create the store";
}

Daha önce çözümü aradım ve uygulamayı simülatörden kaldırmam ve uygulamayı tekrar çalıştırmam gerektiğini keşfettim ve işe yaramadı. Bu sorun için bir çözüm bilen var mı? Lütfen yardım et.

Yanıtlar:


294

Uygulamayı silmek bazen böyle değildir! Öner, uygulamanız zaten yayınlandı! Veri tabanına yalnızca yeni varlık ekleyemez ve devam edemezsiniz - taşıma gerçekleştirmeniz gerekir!

Belgeleri incelemek istemeyen ve hızlı bir çözüm arayanlar için:

  1. .Xcdatamodeld dosyanızı açın
  2. Editöre tıklayın
  3. Model sürümü ekle ... seçeneğini belirleyin
  4. Modelinizin yeni bir sürümünü ekleyin (yeni veri modeli grubu eklendi)
  5. ana dosyayı seçin, dosya denetleyicisini açın (sağ panel)
  6. ve altında Versioned core data modelmevcut veri modeli için yeni veri modeli sürümünüzü seçin
  7. TÜM DEĞİL) "Işık göçü" olarak adlandırmalısınız.
  8. Adresine gidin AppDelegateve nerede persistentStoreCoordinatoroluşturulduğunu bulun
  9. Bu satırı bul if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
  10. nilSeçenekleri ile değiştirin @{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES}(aslında bu yöntemdeki yorumlanmış kodda belirtilmiştir)
  11. Buyrun, iyi eğlenceler!

PS Bu yalnızca hafif geçişler için geçerlidir. Taşıma işleminizin hafif bir taşıma olarak nitelendirilmesi için değişikliklerinizin bu dar bantla sınırlı olması gerekir:

  • Bir özellik (özellik veya ilişki) ekleyin veya kaldırın.
  • İsteğe bağlı olmayan bir özelliği isteğe bağlı yapın.
  • Varsayılan bir değer sağladığınız sürece isteğe bağlı bir özelliği isteğe bağlı yapmayın.
  • Bir varlık ekleyin veya kaldırın.
  • Bir mülkü yeniden adlandırın.
  • Varlığı yeniden adlandırın.

Swift 4 için

coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true])

2
ana dosya, oluşturduğunuz .xcdatamodel dosyasıdır. Yardımcı Programlar bölmesinin (sağ taraftaki birinci) ilk sekmesini açmalı ve "Model Sürümü" nü (Xcode 5.1) bulmalı ve Geçerli'yi seçmelisiniz: "yeni oluşturulan .xcdatamodel"
Stas

1
@ Computer_whiz123, XCode 5.1.1'de buna 'Model Sürümü' denir
Stas

1
Swift'i nasıl yaparım?
Addison

2
Bu hatayı alıyorum: "CoreData: error: -addPersistentStoreWithType: SQLite configuration: (null) URL: file: ///...file.sqlite options: {NSInferMappingModelAutomaticallyOption = 1; NSMigratePersistentStoresAutomaticallyOption = 1;} ... hata döndürdü Domain = NSCocoaErrorDomain Code = 134130 "İşlem tamamlanamadı. (Kakao hatası 134130.) "
CarmenA

3
Hızlı Geçiş seçenekleri:let options = [ NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption:true ]
HamzaGhazouani

285

Simülatörden uygulamayı kaldırın ve projenizde bir temizlik yapın. Bu, bu sorunları ortadan kaldırmalıdır. Uygulamayı sildiğinizde hata ayıklayıcıda çalışmadığınızdan emin olun, aksi takdirde uygulama düzgün bir şekilde silinmez.

Gittiğinden emin olmak Users/INSERT_YOUR_USER_HERE/Library/Application Support/iPhone Simulator/istiyorsanız, çalıştırdığınız sürümün altındaki uygulamanızın klasörü için bu dizini kontrol edin .

Not: Bu yalnızca geliştirme amaçlıdır. Üretim için bir çeşit göç uygulamanız gerekiyor. Google "Temel Veri Taşıma", hafif taşıma en basit olanıdır.


cevapladı Philippe için thx, ben denedim ve işe yaramadı :(, u başka bir öneriniz var mı?
dejoong

Model oluşturmak ve kalıcı mağaza oluşturmak için kullandığınız kodu uygulama temsilcinize gönderebilir misiniz?
Philippe Sabourin

Bu neden olur ve neden böyle bir çözüm hile yapar, ama bu .. yardım edemez .. nywaz, İşte benim oy oy gidiyor .. en iyi ben şimdi kılavuzları takdir etmek için yapabileceğiniz en iyi .. biraz mantıksız yardım arkadaşı için. !!
Apple_iOS0304

Tüm projelerimi yanlışlıkla çöpe atmak için gönderdiğim Xcode 4.6'da bir sorunu
çözmeme yardımcı oldu

6
Bu sadece geliştirme amaçlıdır! Üretim için model sürüm oluşturma ve taşıma özelliklerini kullanırsınız. developer.apple.com/library/ios/#documentation/cocoa/Conceptual/…
Philippe Sabourin

35

Aşağıdaki temel veri yöntemi için AppDelegate.m dosyasında persistentStoreCoordinator oluştururken Seçenekler niteliğini eklemeniz yeterlidir

AMAÇ-Cı

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator != nil)
    {
        return _persistentStoreCoordinator;
    }

    NSLog(@"persistentStoreCoordinator___");
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"MyApp.sqlite"];

    NSMutableDictionary *options = [[NSMutableDictionary alloc] init];
    [options setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
    [options setObject:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption];

    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
    {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    NSLog(@"persistentStoreCoordinator___2");
    return _persistentStoreCoordinator;
}

SWIFT

    lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
    // The persistent store coordinator for the application. This implementation creates and returns a coordinator, having added the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail.
    // Create the coordinator and store
    let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
    let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("SingleViewCoreData.sqlite")
    var failureReason = "There was an error creating or loading the application's saved data."

    // MAIN LINE OF CODE TO ADD
    let mOptions = [NSMigratePersistentStoresAutomaticallyOption: true,
                    NSInferMappingModelAutomaticallyOption: true]

    do {
        try coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: mOptions)
    } catch {
        // Report any error we got.
        var dict = [String: AnyObject]()
        dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data"
        dict[NSLocalizedFailureReasonErrorKey] = failureReason

        dict[NSUnderlyingErrorKey] = error as NSError
        let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
        // Replace this with code to handle the error appropriately.
        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
        NSLog("Unresolved error \(wrappedError), \(wrappedError.userInfo)")
        abort()
    }

    return coordinator
}

Sorunumu çözmüştü ..


1
Bu yazı için teşekkürler gerçekten yararlı
Subramani

23

Cevap: Uygulamayı Simülatörden kaldırın, Temizleyin ve Projenizi Yeniden Oluşturun.

Not: Çekirdek Veri tanımında her değişiklik yaptığınızda, Fiziksel Cihaz veya Simülatörde yüklü uygulamayı silin, Projeyi Temizleyin ve Yeniden Oluşturun.


Simülatördeki içeriği ve ayarları sıfırlamak benim için sorunu düzeltti!
septerr

14

Evet. Fiziksel cihazdaki uygulamayı sildikten ve yeniden oluşturduktan sonra çalışır.


Bu, kabul edilen cevaptan ziyade sorunumu çözdü. Teşekkürler!
Ken W

ne oluyor cevap değil
Eduardo Oliveros

Bu korkunç bir cevaptır, yeni modelinize göç eklemeniz gerekir, aksi takdirde uygulama
eşyada çökecektir

14

Hızlı için, AppDelegate.swift'de satırı bulun

try coordinator!.addPersistentStoreWithType(NSXMLStoreType, configuration:  nil, URL: url, options: nil )

ve yerine

try coordinator!.addPersistentStoreWithType(NSXMLStoreType, configuration: nil, URL: url, options: [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true])

11

Bu hatayla mücadele etmek için birkaç gün geçirdim, ayrıca mergedModelFromBundles çöküyor ve "* adlı iki farklı varlık ile modeller birleştirilemiyor" hatası alıyorum.

Kök sorunu, Xcode'un cihazlardan eski kaynakları kaldırmaması ve veri modelimin (.mom dosyaları) çakışmalara neden olan eski sürümlerine sahip olmasıydı. Bu yüzden uygulamanın silinmesi sorunu aygıtlarımdan birinde düzeltti.

Bu blog gönderisini başka bir SO yanıtı ile bulduktan sonra , TÜM .mom dosyalarını arayan bu satırı değiştirerek uygulamamı eski modellere daha toleranslı hale getirdim:

NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];

yalnızca Filtreler dizinine bakan buna:

NSString *path = [[NSBundle mainBundle] pathForResource:@"Filters" ofType:@"momd"];
NSURL *momURL = [NSURL fileURLWithPath:path];
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];

Ben kullanılan recursivePathsForResourcesOfType gelen soruya yüzden bu app .mom tüm dosyaları giriş yaparak yardım rakama bu Çıkış:

NSArray *momPaths = [self recursivePathsForResourcesOfType:@"mom" inDirectory:[[NSBundle mainBundle] resourcePath]];
NSLog(@"All .mom files:%@",momPaths);

Ayrıca iExplorer kullanarak yabancı .mom dosyaları (henüz onları silmeyi deneyin vermedi) bakmak için.

Aşağıdaki yöntem de yardımcı oldu. Bir varlığın artık [psc manageObjectModel] tarafından döndürülen ve artık hiçbir modelimde veya mağazanın kendisinde bulunmayan birleştirilmiş modelde olduğunu gösterdi. Temiz bir binanın kaldırılmadığı eski bir modelin cihazın önbelleğine alındığına inanmama izin veren buydu. Yöntem, aynı olan, değiştirilen veya modele eklenen veya modele kaldırılan her bir varlığı günlüğe kaydeder. ( bu SO cevabı ile başlangıç ​​noktası olarak yazılmıştır ):

- (BOOL)comparePersistentStore:(NSPersistentStoreCoordinator *)psc withStoreURL: (NSURL *)storeURL {
    NSError *error = nil;

    // Get the entities & keys from the persistent store coordinator
    NSManagedObjectModel *pscModel = [psc managedObjectModel];
    NSDictionary *pscEntities = [pscModel entitiesByName];
    NSSet *pscKeys = [NSSet setWithArray:[pscEntities allKeys]];
    //NSLog(@"psc model:%@", pscModel);
    //NSLog(@"psc keys:%@", pscKeys);
    NSLog(@"psc contains %d entities", [pscModel.entities count]);

    // Get the entity hashes from the storeURL
    NSDictionary *storeMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType
                                                                                          URL:storeURL
                                                                                        error:&error];
    NSDictionary *storeHashes = [storeMetadata objectForKey:@"NSStoreModelVersionHashes"];
    //NSLog(@"store metadata:%@", sourceMetadata);
    NSLog(@"store URL:%@", storeURL);
    NSLog(@"store NSStoreUUID:%@", [storeMetadata objectForKey:@"NSStoreUUID"]);
    NSLog(@"store NSStoreType:%@", [storeMetadata objectForKey:@"NSStoreType"]);
    NSSet *storeKeys = [NSSet setWithArray:[storeHashes allKeys]];

    // Determine store entities that were added, removed, and in common (to/with psc)
    NSMutableSet *addedEntities = [NSMutableSet setWithSet:pscKeys];
    NSMutableSet *removedEntities = [NSMutableSet setWithSet:storeKeys];
    NSMutableSet *commonEntities = [NSMutableSet setWithSet:pscKeys];
    NSMutableSet *changedEntities = [NSMutableSet new];
    [addedEntities minusSet:storeKeys];
    [removedEntities minusSet:pscKeys];
    [commonEntities minusSet:removedEntities];
    [commonEntities minusSet:addedEntities];

    // Determine entities that have changed (with different hashes)
    [commonEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
        NSData *storeHash = [storeHashes objectForKey:key];
        NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
        if ( ! [pscDescrip.versionHash isEqualToData:storeHash]) {
            if (storeHash != nil && pscDescrip.versionHash != nil) {
                [changedEntities addObject:key];
            }
        }
    }];

    // Remove changed entities from common list
    [commonEntities minusSet:changedEntities];

    if ([commonEntities count] > 0) {
        NSLog(@"Common entities:");
        [commonEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
            NSData *storeHash = [storeHashes objectForKey:key];
            NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
            NSLog(@"\t%@:\t%@", key, pscDescrip.versionHash);
        }];
    }
    if ([changedEntities count] > 0) {
        NSLog(@"Changed entities:");
        [changedEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
            NSData *storeHash = [storeHashes objectForKey:key];
            NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
            NSLog(@"\tpsc   %@:\t%@", key, pscDescrip.versionHash);
            NSLog(@"\tstore %@:\t%@", key, storeHash);
    }];
    }
    if ([addedEntities count] > 0) {
        NSLog(@"Added entities to psc model (not in store):");
        [addedEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
            NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
            NSLog(@"\t%@:\t%@", key, pscDescrip.versionHash);
        }];
    }
    if ([removedEntities count] > 0) {
        NSLog(@"Removed entities from psc model (exist in store):");
        [removedEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
            NSData *storeHash = [storeHashes objectForKey:key];
            NSLog(@"\t%@:\t%@", key, storeHash);
        }];
    }

    BOOL pscCompatibile = [pscModel isConfiguration:nil     compatibleWithStoreMetadata:storeMetadata];
    NSLog(@"Migration needed? %@", pscCompatibile?@"no":@"yes");

    return pscCompatibile;
}

kullanım: NSPersistentStoreCoordinator'a her mağaza eklemeden önce çağrılır:

    [self comparePersistentStore:self.psc withStoreURL:self.iCloudStoreURL];
    _iCloudStore = [self.psc addPersistentStoreWithType:NSSQLiteStoreType
                                          configuration:nil
                                                    URL:self.iCloudStoreURL
                                                options:options
                                                  error:&localError];

10

Çekirdek Tarih tanımında her değişiklik yaptığınızda, fiziksel cihazda veya simülatörde yüklü uygulamaları silmelisiniz.


20
Üretim uygulamaları ne olacak? Temel Verilerdeki değişikliklerle App Store'a bir güncelleme gönderirseniz anında çökecekler mi? Thx
rwyland 13:13


3
Evet, CD modelindeki değişiklikler önceki modelle oluşturulan verilerin yüklenmesini engeller. Bunu yapmak için, sorunu tespit etmeniz ve bir Temel Veri Geçişi yapmanız gerekir.
Johan

8
  1. Uygulamanın çalışmasını durdurun.
  2. Simülatördeki uygulamayı silin.
  3. Product -> Clean
  4. İnşa et, koş.

4
üretimde kötü uygulama, app çökmesine
Eduardo Oliveros

7

Swift 2.1, Xcode 7'de benim için çalışan en basit çözüm:

  1. Uygulamayı Simülatörden silin (Ana Ekrana gitmek için Cmd + Üst Karakter + H tuşlarına uzun basın.

  2. Uygulamaların dansını durdurmak için Cmd + Üst Karakter + H tuşlarına tekrar basın

  3. Projenize geri dönün ve tekrar çalıştırın

2 varlık ayarlanmış Temel Veriler yazarken / okurken bu sorunu yaşadım. Uygulamayı silmek ve programı yeniden çalıştırmak sorunu çözdü


2
üretimde kötü uygulama, app çökmesine
Eduardo Oliveros

6

[Simulator App Folder]/Document/*.sqliteVarlıklarda değişiklik yaptıktan sonra dosyayı sildim ve işe yaradı. Ve elbette, .sqlite dosyası kaybolacak tüm depolanmış verileri ve yapıları içerir.


2
Benim için de çalıştı. Bunun yeterli olması makul görünüyor. Zaten DB zaten tüm verileri kaybetmek ...
bor

6

Lütfen simülatörden bir uygulamayı silin ve bir kodu temizleyin ve çalıştırın .its iyi çalışır.


6

Swift kullanıyorsanız.

@Stas tarafından verilen yanıtı takip edin ve Uygulama Temsilcinize nil yerine seçenekleri ekleyin:

let myOptions = [NSMigratePersistentStoresAutomaticallyOption: true,
            NSInferMappingModelAutomaticallyOption: true]
        if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: myOptions, error: &error) == nil {

1
Bunun neden oylandığından emin değilim, ama haklı buldum. Swift için sözdizimini sağladığınız için teşekkür ederiz.
Matt Long

Güzel! İşe yarıyor! teşekkür ederim! Bu sorunu 3 saat boyunca çözmeye çalışıyorum.
mr_ivan777

bu kodu nereye koyacaksınız? Bu kod izin i çekirdek veri yüklemek kap = NSPersistentContainer (ismi: "modeldb") container.loadPersistentStores (completionHandler: {(storeDescription, hatası) içeri hatası = NSError gibi hata {olur?
MAS John.

5

Simülatörde "İçeriği ve Ayarları Sıfırla" yı deneyin. Uygulamayı ve Temiz oluşturmayı sildikten sonra benim için çalıştı


3
Ancak bunu yaparsanız, gerçek makinelerdeki kullanıcılar için aynı sorun yine oluşmaz mı?
Maury Markowitz

4

Uygulamamda da aynı sorunu yaşadım (henüz App Store'da yayınlanmadı).

İşte nasıl düzelttim:

  1. Clean Run (Cmd + Üst Karakter + K)
  2. İOS Simulator'u yeniden başlatın
  3. iOS Simülatörü -> İçeriği ve Ayarları Sıfırla (gezinme çubuğundan)

(3) nihayet düzgün çalışmasını sağlayan adımdı. Bu yardımcı olur umarım!


2

Bazen yönetilen nesne modelinde şemayı değiştirirken uygulamayı cihazdan kaldırabilirsiniz, ancak bazı senaryolarda bu mümkün değildir, örneğin uygulamanızı eski bir şema ile zaten yayınladığınız için.

Bu durumda, eski verilerin yeni şemaya taşınmasıyla ilgilenmeniz gerekir:

Temel Veri Modeli Sürüm Oluşturma ve Veri Taşıma



2

Temel Veri modelinizde değişiklik yaparsanız, Temel Verilere mevcut kalıcı nesneleri (kullanıcılarınızın şu anda piyasaya sürülen sürümle oluşturduğu) yeni modele nasıl adapte edeceğini söyleyen bir taşıma politikası sağlamanız gerekir.

Bazı senaryolar için, Temel Veriler eski modelden yenisine eşlemeyi otomatik olarak çıkarabilir. Daha karmaşık değişiklikler için, taşıma işlemini gerçekleştiren bir mantık uygulamanız gerekebilir.

Ayrıntılar Temel Veri Modeli Sürüm Oluşturma ve Veri Taşıma Programlama Kılavuzu'nda bulunabilir .

Güncelleme
Stack Overflow'daki bu yanıt , Core Data'nın hafif geçişinin temellerini kapsar ve ayrıca başlamanız için bazı kodlar içerir.


Veri geçişi için de aynı cevabım: stackoverflow.com/questions/8881453/…
Dhaval H. Nena

1

Bu sorun genellikle, DB'nin oluşturulduğu sürüm arasındaki uyumsuzluk nedeniyle oluşur . Bu soruna genel yaklaşım , uygulamayı silmek ve yeniden yüklemektir . Ancak bahsettiğiniz durumda DB sürümü Xcode 3.2 ve 4.2'de tamamen farklıdır. Yani daha iyi DB için Xcode aynı sürümünü kullanın.


1

İlk olarak, xcdatamodeldpakette olması gereken tek şey xcdatamodeldosyalar. Sizin alt sınıfları olmalıdır DEĞİL olmak xcdatamodeld. Bunları oradan çıkarın. Derleyiciyi şaşırtmaları için makul bir şans var.

İkinci olarak, hata Temel Verilerin modelinizi bulamadığını gösterir. Veri oluşturup modele dokundunuz mu? Öyleyse tutarsız bir durumdasınız ve verileri silerek (Philippe'in önerdiği) veya modeldeki değişikliklerinizi GERİ alarak düzeltmeniz gerekir .


U modeli xcdatamodel paketinden nasıl çıkarabilirim? ya da shd sadece silmek mi?
dejoong

xcdatamodelDosya olan model orada olmalı . Taşınması gereken .h ve .m dosyalarıdır. Finder'ı kullanın.
Marcus S. Zarra

0

Hatayı alıyordum ama hatayı almamın nedeni aşağıdakilerdi.

Başlangıçta "Giriş" adında bir Varlığım vardı ve veritabanında bu varlık için kaydedilmiş bir satır vardı. Sonra "Kişi" adlı başka bir Varlık ekledim ve ekledikten sonra inşa etmeye gitti ve hatayı aldım. Bu yüzden "Kişi" Varlığını silerek ve sonra uygulamayı oluşturarak sorunu çözdüm, "Giriş" deki satırı sildim ve uygulamayı kapattım. Daha sonra uygulamayı tamamen telefonumdan sildim ve sonra bir yeniden oluşturma yaptım ve iyi çalıştı. Hangi adımın sorunu düzelttiğinden emin değilim (satırın veya uygulamanın silinmesi), ancak umarım bir çözüm arıyorsanız bu yardımcı olacaktır. :)

Düzenleme: Oh ve uygulamayı tekrar oluşturmak için yeni Varlık (benim durumumda "Kişi") silme konusunda endişeleniyorsanız CMD + Z kullanarak daha sonra geri alabilirsiniz unutmayın!


0

Bu sorunu yaşadım - önce simülatörümü sıfırladım ve sonra projeyi temizleyip yeniden oluşturdum. Ve sonra işe yarıyor.


0

Temel verileri (tabloya alan ekleyerek, alanı kaldırarak vb.) Değiştirdiğinizde, uygulamalar belge klasöründeki sqlite dosyasının şemanızla senkronize olması gerekir.

Varsayılan olarak bu dosyanın üzerine yazılmaz, bu dosyanın yeniden oluşturulması gerekir.

Bu adımları takip et:

  1. NSURL tarafından gösterilen klasöre gidin. (Bu yol, çökmeden önce uygulama tarafından oluşturulan özel durum iletisinde bulunabilir.) Örnek: / Kullanıcılar // Kütüphane / Uygulama Desteği / iPhone Simulator // Uygulamalar // Belgeler

  2. sqlite dosyasını kaldır veya yeniden adlandır

  3. Uygulamayı temizleyin ve yeniden çalıştırın
  4. Yeniden çalıştırma uygulaması yeni bir sqlite dosyası oluşturur.

Bu, şema ve Xcode'un senkronize olduğundan emin olacaktır.


-1

Mac uygulama geliştirme için:

  1. Projeyi temizle
  2. Türetilmiş verileri temizle
  3. / Users / YOUR_NAME / Library / Containers / YOUR_APP_BUNDLE_ID / Data / Documents / dizinine gidin ve içindeki tüm dosyaları silin (".sqlite", ".sqlite-shm" ... gibi)

Benim için çalıştı, umarım bu yardımcı olabilir.


-2

iOS Simülatörü -> İçeriği ve Ayarları Sıfırla ...

Benim için çalıştı

iOS Simulator -> İçeriği ve Ayarları Sıfırla ... -> iOS9'da (xcode 7.1) Sıfırlama Çalışmaları


4
üretimde kötü uygulama, app çökmesine
Eduardo Oliveros
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.