Model użyty do otwarcia sklepu jest niezgodny z modelem użytym do utworzenia sklepu

181

Stworzyłem model danych podstawowych w xcode 3.2, a po aktualizacji w Xcode 4.2 dodałem nowy obiekt podklasy NSManagedObject (patrz nowy obiekt).

Po pierwsze, wygląda dziwnie, ponieważ nie należy do tej samej grupy co stara. Oto zdjęcie na moim xcode 4.2 (AlkitabDB to ten, który utworzyłem w xcode 3.2, EndeDB to nowy z bieżącej wersji xcode (4.2):

nowa jednostka nie została zgrupowana w Xdatamodel

Po drugie, pozwalam na to, aby było tak, jak jest, potem uzyskałem dostęp do drugiego bytu (nowego) w taki sam sposób jak pierwszy byt (stary) i pojawia się błąd zatytułowany.

Oto błąd:

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";
}

Już wcześniej szukałem rozwiązania i odkryłem, że powinienem usunąć aplikację z symulatora i ponownie uruchomić aplikację, ale to nie zadziałało. Czy ktoś zna rozwiązanie tego problemu? Proszę pomóż.

dejoong
źródło

Odpowiedzi:

294

Czasami nie ma możliwości usunięcia aplikacji! Zaproponuj, że Twoja aplikacja została już opublikowana! Nie możesz po prostu dodać nowego podmiotu do bazy danych i śmiało - musisz przeprowadzić migrację!

Dla tych, którzy nie chcą zagłębiać się w dokumentację i szukają szybkiej poprawki:

  1. Otwórz plik .xcdatamodeld
  2. kliknij Edytor
  3. wybierz Dodaj wersję modelu ...
  4. Dodaj nową wersję swojego modelu (dodano nową grupę modeli danych)
  5. wybierz główny plik, otwórz inspektora plików (prawy panel)
  6. i pod Versioned core data modelwybierz nową wersję modelu danych dla bieżącego modelu danych
  7. TO NIE WSZYSTKO) Powinieneś wykonać tak zwaną „migrację światła”.
  8. Idź do swojego AppDelegatei dowiedz się, gdzie persistentStoreCoordinatorjest tworzony
  9. Znajdź tę linię if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
  10. Zamień nilopcje na @{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES}(faktycznie podane w skomentowanym kodzie w tej metodzie)
  11. Proszę bardzo miłej zabawy!

PS Dotyczy to tylko lekkiej migracji. Aby migracja kwalifikowała się jako migracja lekka, zmiany muszą ograniczać się do tego wąskiego pasma:

  • Dodaj lub usuń właściwość (atrybut lub relację).
  • Ustaw opcjonalną właściwość jako opcjonalną.
  • Ustaw opcjonalny atrybut jako nieopcjonalny, o ile podasz wartość domyślną.
  • Dodaj lub usuń jednostkę.
  • Zmień nazwę właściwości.
  • Zmień nazwę bytu.

Dla Swift 4

coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true])
Staś
źródło
2
głównym plikiem jest .xcdatamodel, który utworzyłeś. Powinieneś otworzyć pierwszą kartę w panelu Narzędzia (po prawej stronie) i znaleźć „Wersja modelu” (Xcode 5.1) i wybrać Bieżące: „Twój nowo utworzony .xcdatamodel”
Stas
1
@ Computer_whiz123, w XCode 5.1.1 nazywa się „Wersja modelu”
Stas
1
Jak mam to zrobić jest Swift?
Addison
2
Otrzymuję ten błąd: „CoreData: błąd: -addPersistentStoreWithType: konfiguracja SQLite: (pusty) URL: plik: ///...file.sqlite opcje: {NSInferMappingModelAutomaticallyOption = 1; NSMigratePersistentStoresAutomaticallyOption = 1;} ... zwrócił błąd Błąd Domena = NSCocoaErrorDomain Code = 134130 "Operacja nie mogła zostać zakończona. (Błąd kakao 134130.) ”
CarmenA
3
Opcje let options = [ NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption:true ]
szybkiej
285

Usuń aplikację z symulatora i wykonaj czysty projekt. To powinno wyjaśnić te problemy. Upewnij się, że nie uruchamiasz się w debuggerze podczas usuwania aplikacji, w przeciwnym razie nie usunie ona poprawnie.

Jeśli chcesz mieć pewność, że zniknął, sprawdź w tym katalogu Users/INSERT_YOUR_USER_HERE/Library/Application Support/iPhone Simulator/folder aplikacji w uruchomionej wersji.

Uwaga: To jest tylko dla rozwoju. W przypadku produkcji musisz zaimplementować pewien rodzaj migracji. Google „Core Data Migration”, przy czym najprostsza jest lekka migracja.

Philippe Sabourin
źródło
dzięki za odpowiedź Philippe, próbowałem i to nie zadziałało :(, czy masz jakieś inne sugestie?
dejoong,
Czy możesz opublikować kod, którego używasz, aby utworzyć model i trwały sklep w delegacie aplikacji?
Philippe Sabourin
To trochę nieuzasadnione, dlaczego tak się dzieje i dlaczego takie rozwiązanie rozwiązuje problem, ale to jest to ... nie mogę pomóc .. nywaz, oto mój głos w górę .. najlepiej, co mogę teraz zrobić, aby docenić twoje wytyczne .. dziękuję bardzo dla pomocnika. !!
Apple_iOS0304,
Pomógł mi rozwiązać problem w Xcode 4.6, gdzie przez pomyłkę wysłałem do kosza wszystkie moje projekty: /
ramirogm
6
To jest tylko dla rozwoju! Do produkcji używasz wersji i migracji modelu. developer.apple.com/library/ios/#documentation/cocoa/Conceptual/…
Philippe Sabourin
35

Wystarczy dodać atrybut Options podczas tworzenia persistentStoreCoordinator w pliku AppDelegate.m dla podstawowej metody danych, jak poniżej

CEL 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;
}

SZYBKI

    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
}

To rozwiązało mój problem ...

Dhaval H. Nena
źródło
1
Dziękuję za ten post, który jest naprawdę pomocny
Subramani
23

Odpowiedź: Usuń aplikację z symulatora, przeprowadź czyszczenie i ponownie zbuduj projekt.

Uwaga: za każdym razem, gdy wprowadzasz zmiany w definicji danych podstawowych, usuń aplikację zainstalowaną na urządzeniu fizycznym lub symulatorze, wyczyść projekt i przebuduj ponownie.

Bhavin
źródło
Zresetowanie zawartości i ustawień w symulatorze rozwiązało problem dla mnie! Dzięki.
septerr
14

Tak. Po usunięciu aplikacji na urządzeniu fizycznym i odbudowaniu działa.

world-software.net
źródło
To faktycznie rozwiązało mój problem, a nie zaakceptowaną odpowiedź. dzięki!
Ken W
co dzieje się w produkcji, to nie jest odpowiedź
Eduardo Oliveros
To jest straszne odpowiedź, trzeba dodać migrację do nowego modelu inaczej aplikacja padnie w prod
aryaxt
14

Aby szybko, w AppDelegate.swift znajdź linię

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

i zastąp go

try coordinator!.addPersistentStoreWithType(NSXMLStoreType, configuration: nil, URL: url, options: [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true])
Ali Asgher Lakkadshaw
źródło
11

Właśnie spędziłem kilka dni walcząc z tym błędem, a także awarie scaloneModelFromBundles i otrzymując błąd „Nie mogę scalić modeli z dwoma różnymi obiektami o nazwie *”.

Okazuje się, że głównym problemem było to, że Xcode nie usuwa starych zasobów z urządzeń i miałem stare wersje mojego modelu danych (pliki .mom), które powodowały konflikty. Dlatego usunięcie aplikacji rozwiązało problem na jednym z moich urządzeń.

Po znalezieniu tego postu na blogu za pomocą innej odpowiedzi SO, uczyniłem moją aplikację bardziej tolerancyjną dla starych modeli, zmieniając tę ​​linię, która szuka WSZYSTKICH plików .mom:

NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];

do tego, który wygląda tylko w katalogu Filtry:

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

Użyłem recursivePathsForResourcesOfType z tego, więc pytanie : aby rozwiązać ten problem, rejestrując wszystkie pliki .mom w aplikacji:

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

Użyłem również iExplorer, aby sprawdzić niepotrzebne pliki .mom (jeszcze nie próbowałem ich usunąć).

Poniższa metoda również była pomocna. To pokazało, że jednostka była w scalonym modelu zwróconym przez [psc manageObjectModel], który już nie istniał w żadnym z moich modeli ani w samym sklepie. To pozwoliło mi uwierzyć, że stary model był buforowany na samym urządzeniu, którego czysty budynek nie usunął. Metoda rejestruje każdą jednostkę, która jest taka sama, została zmieniona, dodana lub usunięta z modelu. (napisane z tą SO odpowiedzią jako punktem wyjścia):

- (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;
}

użycie: wywoływane przed dodaniem każdego sklepu do NSPersistentStoreCoordinator:

    [self comparePersistentStore:self.psc withStoreURL:self.iCloudStoreURL];
    _iCloudStore = [self.psc addPersistentStoreWithType:NSSQLiteStoreType
                                          configuration:nil
                                                    URL:self.iCloudStoreURL
                                                options:options
                                                  error:&localError];
Symetryczny
źródło
10

Za każdym razem, gdy wprowadzasz zmiany w definicji daty podstawowej, należy usuwać aplikacje zainstalowane na urządzeniu fizycznym lub symulatorze.

pierrotlefou
źródło
20
Co z aplikacjami produkcyjnymi? Czy natychmiast ulegną awarii, jeśli prześlesz aktualizację do App Store ze zmianami w podstawowych danych? Thx
rwyland
3
Tak, zmiany w modelu CD uniemożliwiają ładowanie danych wygenerowanych w poprzednim modelu. Aby sobie z tym poradzić, musisz wykryć problem i przeprowadzić migrację podstawowych danych.
Johan
8
  1. Zatrzymaj uruchamianie aplikacji.
  2. Usuń aplikację z symulatora.
  3. Product -> Clean
  4. Buduj, biegaj.
Tom Howard
źródło
4
zła praktyka w produkcji, awaria aplikacji
Eduardo Oliveros
7

Najprostszym rozwiązaniem, które działało dla mnie w Swift 2.1, Xcode 7 jest:

  1. Usuń aplikację z symulatora (Cmd + Shift + H, aby przejść do ekranu głównego. Długo naciśnij aplikację, kliknij krzyżyk, zwykły sposób usuwania aplikacji z telefonu)

  2. Cmd + Shift + H ponownie, aby zatrzymać taniec aplikacji

  3. Wróć do swojego projektu i uruchom ponownie

Miałem ten problem podczas pisania / czytania z Core Data przy skonfigurowanych 2 podmiotach. Usunięcie aplikacji i ponowne uruchomienie programu rozwiązało problem

Naishta
źródło
2
zła praktyka w produkcji, awaria aplikacji
Eduardo Oliveros
6

Właśnie usunąłem [Simulator App Folder]/Document/*.sqliteplik po wprowadzeniu zmian w elementach i zadziałało. Oczywiście plik .sqlite zawiera wszystkie zapisane dane i struktury, które zostaną utracone.

AHHP
źródło
2
Pracowałem też dla mnie. Wydaje się rozsądne, że to powinno wystarczyć. Tracisz wszystkie dane już w DB ...
bor
6

Usuń aplikację z symulatora, wyczyść kod i uruchom. Działa dobrze. Może to być jego pomoc TY.

Sarit Bahuguna
źródło
6

Jeśli używasz Swift.

Postępuj zgodnie z odpowiedzią @Stas i wstaw opcje zamiast zera w Delegacie aplikacji:

let myOptions = [NSMigratePersistentStoresAutomaticallyOption: true,
            NSInferMappingModelAutomaticallyOption: true]
        if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: myOptions, error: &error) == nil {
J Z.
źródło
1
Nie jestem pewien, dlaczego to zostało odrzucone, ale poprawiłem to. Dziękujemy za podanie składni Swift.
Matt Long
Miły! Działa! Dziękuję Ci! Próbuję rozwiązać ten problem przez 3 godziny.
mr_ivan777
gdzie umieścić ten kod? ładuję podstawowe dane z tym kodem let kontener = NSPersistentContainer (name: "modeldb") container.loadPersistentStores (completeHandler: {(storeDescription, error) in if let error = error as NSError? {
MAS. John
5

Wypróbuj „Resetuj zawartość i ustawienia” w symulatorze. Pracowałem dla mnie po usunięciu aplikacji i czystej kompilacji

Josh10
źródło
3
Jednak jeśli to zrobisz, czy ten sam problem nie wystąpi w przypadku użytkowników na prawdziwych komputerach?
Maury Markowitz
4

Wystąpił ten sam problem z moją aplikacją (jeszcze nie wydany w App Store).

Oto jak to naprawiłem:

  1. Uruchom czyszczenie (Cmd + Shift + K)
  2. Uruchom ponownie symulator iOS
  3. Symulator iOS -> Resetuj zawartość i ustawienia (z paska nawigacyjnego)

(3) był krokiem, który w końcu pozwolił mu działać poprawnie. Mam nadzieję że to pomoże!

bigtex777
źródło
2

Chociaż czasami można po prostu usunąć aplikację z urządzenia podczas zmiany schematu w zarządzanym modelu obiektowym, w niektórych scenariuszach nie jest to możliwe, np. Ponieważ aplikacja została już opublikowana ze starym schematem.

W takim przypadku musisz zadbać o migrację starych danych do nowego schematu:

Wersjonowanie podstawowego modelu danych i migracja danych

Mikrofon
źródło
2

Jeśli wprowadzisz zmiany w modelu Core Data, musisz zapewnić zasadę migracji, która powie Core Data, jak zaadaptować istniejące obiekty utrwalone (utworzone przez użytkowników w aktualnie wydanej wersji) do nowego modelu.

W niektórych scenariuszach dane podstawowe mogą automatycznie wnioskować o odwzorowaniu ze starego modelu na nowy. W przypadku bardziej złożonych zmian konieczne może być zaimplementowanie logiki, która wykonuje migrację.

Szczegóły można znaleźć w Podręczniku programowania wersji i migracji danych modelu podstawowego .

Aktualizacja
Ta odpowiedź tutaj na temat przepełnienia stosu obejmuje podstawy niewielkiej migracji Core Data, a także zawiera trochę kodu na początek.

Thomas Zoechling
źródło
Oto moja odpowiedź na to samo w przypadku migracji danych: stackoverflow.com/questions/8881453/…
Dhaval H. Nena
1

Ten problem występuje na ogół z powodu niezgodności między wersją, na której utworzono bazę danych. Ogólne podejście do tego problemu polega na usunięciu aplikacji i ponownym zainstalowaniu . Ale we wspomnianym przypadku wersja DB jest zupełnie inna w Xcode 3.2 i 4.2. Lepiej więc użyj tej samej wersji Xcode dla DB.

Jayprakash Dubey
źródło
1

Po pierwsze, jedyne rzeczy, które powinny znajdować się w xcdatamodeldpakiecie, to xcdatamodelpliki. Twoje podklasy NIE powinny znajdować się w xcdatamodeld. Przenieś je stamtąd. Istnieje spora szansa, że ​​mylą one kompilator.

Po drugie, błąd wskazuje, że dane podstawowe nie mogą znaleźć twojego modelu. Czy utworzyłeś dane, a następnie dotknąłeś modelu? Jeśli tak, jesteś w niespójnym stanie i musisz to naprawić, usuwając dane (sugerowane przez Philippe'a) lub wprowadzając zmiany modelu WSTECZ .

Marcus S. Zarra
źródło
masz pomysł, jak mogę wyjąć model z pakietu xcdatamodel? czy powinienem to po prostu usunąć?
dejoong
Powinien tam być model, którym jest xcdatamodelplik . Należy przenieść pliki .h i .m. Użyj Findera.
Marcus S. Zarra
0

Wystąpił błąd, ale powodem tego był następujący błąd.

Pierwotnie miałem jeden podmiot o nazwie „Wpis” i zapisałem jeden wiersz dla tego podmiotu w bazie danych. Następnie dodałem inny byt o nazwie „Osoba” i po dodaniu go poszedłem do kompilacji i dostałem błąd. Rozwiązałem więc problem, usuwając encję „Osoba”, a następnie budując aplikację, usuwając wiersz znajdujący się w „Entry”, a następnie zamykając aplikację. Następnie usunąłem aplikację całkowicie z telefonu, a następnie wykonałem przebudowę i działała dobrze. Nie wiem, który krok rozwiązał problem (usunięcie wiersza lub aplikacji), ale mam nadzieję, że jeśli szukasz rozwiązania, to pomoże. :)

Edycja: Aha, a jeśli martwisz się usunięciem nowego Entity (w moim przypadku „Person”), aby ponownie zbudować aplikację, pamiętaj, że możesz ją później odzyskać, używając CMD + Z!

daveomcd
źródło
0

Miałem ten problem - najpierw zresetowałem symulator, a następnie wyczyściłem projekt i przebudowałem. A potem to działa.

Yashu
źródło
0

Po zmianie podstawowych danych (dodawanie pola do tabeli, usuwanie pola itp.) Plik sqlite w folderze dokumentów aplikacji musi być zsynchronizowany ze schematem.

Ten plik nie jest domyślnie nadpisywany, należy go ponownie wygenerować.

Wykonaj następujące kroki:

  1. Przejdź do folderu wskazanego przez NSURL. (Ścieżkę tę można znaleźć w komunikacie o wyjątku wygenerowanym przez aplikację przed awarią.) Przykład: / Users // Library / Application Support / iPhone Simulator // Applications // Documents

  2. usuń lub zmień nazwę pliku sqlite

  3. Wyczyść i uruchom ponownie aplikację
  4. Ponowne uruchomienie aplikacji wygeneruje nowy plik sqlite.

To upewni się, że schemat i Xcode są zsynchronizowane.

Prashant Nidgunde
źródło
-1

W przypadku tworzenia aplikacji dla komputerów Mac:

  1. Oczyść projekt
  2. Wyczyść dane pochodne
  3. Przejdź do / Users / YOUR_NAME / Library / Containers / YOUR_APP_BUNDLE_ID / Data / Documents / i usuń wszystkie pliki w środku (takie jak „.sqlite”, „.sqlite-shm” ...)

To działało dla mnie, mam nadzieję, że to może być pomocne.

Eneko
źródło
-2

Symulator iOS -> Resetuj zawartość i ustawienia ...

Pracował dla mnie

Symulator iOS -> Resetuj zawartość i ustawienia ... -> Resetuj Działa również na iOS9 (xcode 7.1)

niravdesai21
źródło
4
zła praktyka w produkcji, awaria aplikacji
Eduardo Oliveros