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):
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óż.
let options = [ NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption:true ]
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.
źródło
Wystarczy dodać atrybut Options podczas tworzenia persistentStoreCoordinator w pliku AppDelegate.m dla podstawowej metody danych, jak poniżej
CEL C
SZYBKI
To rozwiązało mój problem ...
źródło
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.
źródło
Tak. Po usunięciu aplikacji na urządzeniu fizycznym i odbudowaniu działa.
źródło
Aby szybko, w AppDelegate.swift znajdź linię
i zastąp go
źródło
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:
do tego, który wygląda tylko w katalogu Filtry:
Użyłem recursivePathsForResourcesOfType z tego, więc pytanie : aby rozwiązać ten problem, rejestrując wszystkie pliki .mom w aplikacji:
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):
użycie: wywoływane przed dodaniem każdego sklepu do NSPersistentStoreCoordinator:
źródło
Za każdym razem, gdy wprowadzasz zmiany w definicji daty podstawowej, należy usuwać aplikacje zainstalowane na urządzeniu fizycznym lub symulatorze.
źródło
Product
->Clean
źródło
Najprostszym rozwiązaniem, które działało dla mnie w Swift 2.1, Xcode 7 jest:
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)
Cmd + Shift + H ponownie, aby zatrzymać taniec aplikacji
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
źródło
Właśnie usunąłem
[Simulator App Folder]/Document/*.sqlite
plik po wprowadzeniu zmian w elementach i zadziałało. Oczywiście plik .sqlite zawiera wszystkie zapisane dane i struktury, które zostaną utracone.źródło
Usuń aplikację z symulatora, wyczyść kod i uruchom. Działa dobrze. Może to być jego pomoc TY.
źródło
Jeśli używasz Swift.
Postępuj zgodnie z odpowiedzią @Stas i wstaw opcje zamiast zera w Delegacie aplikacji:
źródło
Wypróbuj „Resetuj zawartość i ustawienia” w symulatorze. Pracowałem dla mnie po usunięciu aplikacji i czystej kompilacji
źródło
Wystąpił ten sam problem z moją aplikacją (jeszcze nie wydany w App Store).
Oto jak to naprawiłem:
(3) był krokiem, który w końcu pozwolił mu działać poprawnie. Mam nadzieję że to pomoże!
źródło
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
źródło
Musisz przeprowadzić migrację modelu danych podstawowych przy użyciu migracji. Za każdym razem, gdy zmieniasz model, czynisz go niekompatybilnym bez wersji. Zapnij pasy, to trochę włochaty temat.
http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/CoreDataVersioning/Articles/Introduction.html
źródło
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.
źródło
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.
źródło
Po pierwsze, jedyne rzeczy, które powinny znajdować się w
xcdatamodeld
pakiecie, toxcdatamodel
pliki. Twoje podklasy NIE powinny znajdować się wxcdatamodeld
. 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 .
źródło
xcdatamodel
plik . Należy przenieść pliki .h i .m. Użyj Findera.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!
źródło
Miałem ten problem - najpierw zresetowałem symulator, a następnie wyczyściłem projekt i przebudowałem. A potem to działa.
źródło
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:
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
usuń lub zmień nazwę pliku sqlite
To upewni się, że schemat i Xcode są zsynchronizowane.
źródło
W przypadku tworzenia aplikacji dla komputerów Mac:
To działało dla mnie, mam nadzieję, że to może być pomocne.
źródło
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)
źródło