2011-08-12 12 views
14

Mam plik modelu o nazwie "Model". Jeśli zmienię nazwę na "SomeOtherName", to po prostu nie zostanie załadowany.Modelowe pliki danych nie ładują się przy zmianie nazwy

initWithContentsOfURL zwraca nil a:

mergedModelFromBundles: [NSArray arrayWithObjects:[NSBundle mainBundle], nil]; 

... wywala z ponieważ sądzi, że jest zerowa w tej tablicy.

Mogę zmienić nazwę mojego modelu, więc co jest nie tak? Nie mogę podać więcej informacji, ponieważ ich nie mam: P Model SomeOtherName jest umieszczony w pakiecie i powinien być ładowany poprawnie.

Dzięki

Odpowiedz

0

Jak wygląda twój kod inicjujący Core Data? Powinno to wyglądać następująco:

NSManagedObjectModel *managedObjectModel = nil; 
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"SomeOtherName" withExtension:@"mom"]; 

NSAssert(modelURL != nil); 
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; 
+0

Wygląda to tak. I loguję się do modeluURL do konsoli i umieszczam w Terminalu i robię ls. Daje mi SomeOtherName.mom i VersionInfo.plist (zawartość folderu SomeOtherName.momd). – david

+0

Czy na pewno masz to potwierdzenie w miejscu, np. adres URL nie jest zerowy? Wyświetlanie kodu inicjowania kontekstu rdzenia danych w pytaniu może pomóc. – ndfred

2

Najbardziej prawdopodobną przyczyną jest to, że nowa nazwa nie jest uwzględniana w celu kompilacji. Sprawdź cel dołączonych plików i upewnij się, że jest tam nowa nazwa. Jeśli nie, dodaj to. Jeśli istnieje stara nazwa pliku, usuń ją przed dodaniem nowej.

Jeśli jest w kompilacji, potwierdź, że nowy plik zachowuje rozszerzenie .xcdatamodel. Sprawdź wbudowany pakiet produktów, aby upewnić się, że zawiera on plik .mom lub .momd o nowej nazwie.

Twoje mergedModelFromBundles: powinna wyglądać następująco:

NSManagedObjectModel *mom=[NSManagedObjectModel mergedModelFromBundles:[NSArray arrayWithObject:[NSBundle mainBundle]]; 

... albo:

NSManagedObjectModel *mom=[NSManagedObjectModel mergedModelFromBundles:[NSArray arrayWithObjects:[NSBundle mainBundle],nil] ]; 
+0

Scalenie wygląda tak. Wyjątkiem jest: "NSInvalidArgumentException", powód: "*** - [__ NSArrayM insertObject: atIndex:]: obiekt nie może być zerowy ' *** Stos wywoławczy pierwszego rzutu: – david

+0

Jeśli używasz pierwszego formularza i pojawia się błąd wtedy problem polega na tym, że 'mainbundle' nie jest zwracany z jakiegoś powodu. Powinieneś zanotować zwrot z [NSBundle mainBundle], aby potwierdzić. Pracujesz na MacOS lub iOS? – TechZen

26

po prostu wpadł na ten sam problem. Oto, jak to rozwiązałem:

Zmiana nazwy pliku modelu nie wystarczy, ponieważ nie zmienia nazwy odniesienia do aktualnej wersji modelu .

Okazuje się, że wersja modelu jest przechowywana w osobnym pliku plist. Po prostu otwórz go w edytorze tekstu i zmień starą nazwę na nazwę nowego pliku modelu.

Plik: YourNEWModelFile.xcdatamodeld/.xccurrentversion

<plist version="1.0"> 
    <dict> 
    <key>_XCCurrentVersionName</key> 
    <string>YourModelFile.xcdatamodel</string> <-- Change this to YourNEWModelFile 
    </dict> 
</plist> 

Należy pamiętać, że powinny to zrobić tylko jeśli zmienić nazwę pliku modelu w trakcie rozwoju. Aby przeprowadzić migrację modelu danych do nowej wersji, postępuj zgodnie z dokumentami Core Data.

+0

Nie widzę tego pliku plist. Czy to w pakiecie? –

+0

Przepraszam, znalazłem. Sądzę, że innym rozwiązaniem jest usunięcie aplikacji z karty SIM? –

+0

To zadziałało dla mnie! thx: otwieranie w terminalu otwartym - textedit "filelocation" –

1

Korzystanie Xcode 7.2.1:

  1. idź do Nawigatora projektu
  2. Wybierz plik modelu danych (np MyProject.xcdatamodeld)
  3. Wybierz ten plik za Inspector File
  4. zmienić model Wersja
+0

To jedyne rozwiązanie, które działało dla mnie na Xcode 8 i Swift 3. Zmieniłem wersję Tools na Xcode 7.3 zamiast 8 i zaczęło działać. – zeeshan

1

Wpadłem na ten problem niedawno, gdy dodałem nowy atrybut do mojego modelu danych.

musiałem wykonać następujące czynności:

  1. Kopiuj z treścią moich Entity+CoreDataClass.h i Entity+CoreDataClass.m pliki do edytora tekstu, aby zapisać właściwości niestandardowych miałem stworzony dla tych z klasy (np obliczonych właściwości)
  2. Usuń pliki Xcode 4 generowane dla mnie: Entity+CoreDataClass.h, Entity+CoreDataClass.m, StockEntity+CoreDataProperties.h, & StockEntity+CoreDataProperties.m
  3. Dodaj nowe atrybuty do jednostki w pliku .xcdatamodelId
  4. Wybierz element z listy i wybierz Editor -> Create NSManagedObject Subclass...
  5. Dodaj obliczonych właściwości skopiowane w kroku 1 z powrotem do Entity+CoreDataClass.h i Entity+CoreDataClass.m plików
  6. Wybierz fazy budowania mojego celu i usunąć plik Entity+CoreDataClass.m z Compile Sources lista
  7. Dodaj plik .xcdatamoelId do listy Compile Sources.

Byłem wtedy w stanie pomyślnie zbudować i uruchomić projekt.

1

Ten pracował dla mnie:

  1. Kliknij na YourName.xcdatamodel
  2. kliknij prawym przyciskiem myszy, aby wyświetlić plik inspektora
  3. Po prawej stronie widać „Target Membership”, nie powinno być znacznik wyboru.

(Sprawdź, czy nazwa AppDelegate jest taka sama jak pliku xcdatamodel -> niech kontenera = NSPersistentContainer (name: "YourName") ......)

Powiązane problemy