Co muszę zrobić, aby Dane podstawowe automatycznie migrowały modele?

Czytałem w dokumentacji o automatycznej / lekkiej migracji dla podstawowych modeli danych - ale mam problemy w rzeczywistości implementacji.

Jak rozumiem, aplikacja powinna zauważyć, że model, który ma i model, który istnieje na urządzeniu, już nie są takie same. Jeśli dodałeś tylko atrybuty lub relacje i podobne proste zmiany, model powinien zostać zaktualizowany automatycznie.

Any pointers-Czy muszę coś ustawić w xCode?

Author: Grouchal, 2009-06-19

10 answers

Teraz odkryłem, że jest to dość proste-kiedy już wiesz, gdzie szukać.

W moim AppDelegate skonfigurowałem NSPersistentStoreCoordinator - i musisz dodać kilka opcji do tego, aby powiedzieć, że obsługuje auto-migrate:

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]) {
    // Handle error
    NSLog(@"Problem with PersistentStoreCoordinator: %@",error);
}

Następnie trzeba zrobić mały trick w xCode:

  1. Wybierz plik xcdatamodel
  2. Wybierz menu Projekt u góry - następnie model danych-następnie wybierz Dodaj wersję modelu
  3. Twój plik xcdatamodel zostanie przeniesiony do nowego katalog o tej samej nazwie co plik xcdatamodel, ale z rozszerzeniem xcdatamodeld - w tym katalogu będzie drugi plik z 2 w nazwie. Wybierz nowy plik, a następnie projekt- > model danych - > Ustaw bieżącą wersję ( w Xcode 4 robisz to )
  4. Jeśli wprowadziłeś już zmiany, które spowodowały, że twój projekt jest niezgodny - usuń te zmiany z oryginalnego pliku xcdatamodel. Jeśli jeszcze nie wprowadziłeś zmian-po prostu edytuj 2.plik xcdatamodel (ta, którą właśnie wykonałeś aktualną wersję).
  5. Teraz, gdy zainstalujesz tę wersję na urządzeniu, które ma stary model - automatycznie zaktualizuje ten model do nowego modelu.

To wydaje się wspaniałe i tak proste, jak chciałem - ale myślę, że musisz być ostrożny podczas rozwoju, jak zmienić model-w przeciwnym razie będziesz musiał stworzyć nową wersję dla każdej zmiany.

Myślę, że to, co zrobię, to to, że zachowam wszystkie zmienione pliki, a potem, gdy będę gotowy do wdrożyć moją aktualizację usunę wszystkie pliki pomiędzy i po prostu wdrożyć z najstarszych i najnowszych modeli.


Aktualizacja (15/07/2011):

Podziękowania dla @ rockstarberlin za zwrócenie uwagi na zaktualizowaną dokumentację w apple:

Xcode 4: ustawienie bieżącej wersji zarządzanego modelu obiektowego

Update: 19/08/2013 better link:

Https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/vmModelFormat.html

 138
Author: Grouchal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-02 05:44:57

To było niezwykle pomocne. Dokumentacja Apple była-jak zwykle-żałośnie niekompletna. Polecam zrobić czystą kompilację, ponieważ napotkałem błąd "nie można łączyć modeli z dwoma różnymi podmiotami xxx", gdy po raz pierwszy uruchomiłem po wprowadzeniu tych zmian. Czysty budynek naprawił to.

 13
Author: Scott Means,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-02 21:34:36

Odpowiedź Grouchala jest idealna...ale jeśli nadal masz "nie można łączyć modeli z dwoma różnymi podmiotami xxx", nawet po oczyszczeniu kompilacji kilka razy...Możesz mieć problemy z ładowaniem modela managedobject...spójrz na to...co pomogło mi to naprawić..

Problemy z migracją danych podstawowych

 6
Author: Santthosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-18 12:21:26

Ponadto, jeśli natknąłeś się na ten post, tak jak ja, po otrzymaniu błędu "model używany do otwierania sklepu jest niezgodny z tym, który został użyty do utworzenia sklepu" i po prostu debugujesz za pomocą symulatora i chcesz całkowicie zastąpić stary zainstalowany model, możesz po prostu zresetować aplikację symulatora lub usunąć aplikację z symulatora prawdopodobnie zadziała również.

Nie przyszło mi do głowy, aby spróbować tego, aż do przeczytania postów tutaj, w którym momencie zdałem sobie sprawę, że mam zainstalowałem aplikację w symulatorze, a następnie zmieniłem model, powodując wspomniany wcześniej błąd run-time.

 3
Author: dreyln,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-15 23:26:36

Aby sprawdzić odpowiedź Santthosha, pomyślałem, że zamieszczę fragment kodu tutaj. Musisz utworzyć managedObjectModel z initWithContentsOfURL: zamiast mergedModelFromBundles: w przeciwnym razie otrzymasz błąd:

Nie można łączyć modeli z dwoma różnymi podmioty XXX i XXX

Jeśli Twój plik Modelu ma nazwę "Model", oto jak tworzysz managedObjectModel:

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

Kredyt na ten wpis na blogu .

 1
Author: samvermette,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-30 22:52:54

Menu w Xcode 4 trochę się zmieniło. oto opis jak to zrobić w Xcode 4:

Xcode 4: ustawienie bieżącej wersji zarządzanego modelu obiektowego

 1
Author: rockstarberlin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-14 12:48:38

Mam ten problem od lat i próbowałem wszystkich tych odpowiedzi bez skutku. Dziś w końcu zrozumiałem, co robię źle. Bardzo prosty problem, ale go przeoczyłem. Podczas tworzenia nowszej wersji modelu danych, jeśli dodajesz kolumny, zaznacz je jako opcjonalne. Jeśli tego nie zrobisz, prosta migracja nie zadziała, ponieważ nowe wartości kolumn nie zostaną wypełnione.

Jak tylko upewniłem się, że moje nowe kolumny mają zaznaczone "opcjonalne", ponownie próbowałem migracji i zadziałało.

 1
Author: Brain2000,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-02 21:55:23

Natknąłem się na ten post z powodu innych problemów, ale błąd był " konfiguracja modelu użytego do otwarcia sklepu jest niezgodna z tą, która została użyta do utworzenia sklepu."

Oto mój problem i rozwiązanie go. W moim modelu używałem konfiguracje. Niektóre byty były przechowywane w jednym pliku, a inne w drugim pliku. (Mam kilka domyślnych, które mogą okresowo wymagać pobrania, i byłoby to niesamowity ból, aby połączyć je w całość). W każdym razie, stworzyłem nową istotę. Program wydawał się działać dobrze, ale za każdym razem, gdy zrezygnowałem, otrzymałem powyższy błąd.

Rozwiązaniem było przyjrzenie się moim konfiguracjom, uświadomienie sobie, że miałem byt, którego obecnie nie ma w żadnej z konfiguracji, i dodanie go do jednej. Działa jak marzenie.

To nie rozwiąże problemu operacji. Ale może jakaś sfrustrowana osoba, która wyląduje tutaj przez google, będzie w Łodzi, w której byłem :)

 1
Author: The Cappy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-01 23:03:29

IOS 4.0 +

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"model" withExtension:@"momd"];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
 0
Author: Stian Høiland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-28 22:34:58

Minor edit to @ Grouchal ' s awesome instructions above for Xcode version 5:

Stare: 2. Wybierz menu Projekt u góry - następnie model danych-następnie wybierz Dodaj wersję modelu

Wersja 5+: 2. Wybierz Menu Edytor, a następnie Dodaj wersję modelu..., wpisz nazwę wersji i na podstawie modelu (wybierz oryginalny model z listy)

 0
Author: PGSeattle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-17 22:27:03