iPhone Core Data " Automatyczna Lekka migracja"
[1]}próbuję zaktualizować aplikację, która implementuje podstawowy magazyn danych. Dodaję atrybut do jednego z Bytów.
Dodałem następujący kod do mojej klasy delegata:
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator != nil) {
return persistentStoreCoordinator;
}
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"Shoppee.sqlite"]];
NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
NSLog(@"Error: %@",error);
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return persistentStoreCoordinator;
}
Pochodzi z następującego adresu URL: Doc
Podczas wykonywania kodu pojawia się następujący błąd:
2009-12-01 20:04:22.877
Shoppee[25633: 207] Error: Error
Domain = NSCocoaErrorDomain Code = 134130
UserInfo=0x1624d20 "Operacja nie mogła zostać zakończona. (Błąd kakao 134130./ 2009-12-01 20:04:22 Error Domain = NSCocoaErrorDomain Code = 134130 UserInfo=0x1624d20 "Operacja nie mogła zostać zakończona. / Align = "left" / 134130)", { URL = file://localhost/Users/Eric/Library/Application%20Support/iPhone%20Simulator/User/Applications/A8A8FB73-9AB9-4EB7-8F83-82F5B4467AF1/Documents/MyApp.sqlite; plotdata = { NSPersistenceFrameworkVersion = 241; NSStoreModelVersionHashes = { Pozycja = ; Store = ; }; NSStoreModelVersionHashesVersion = 3; Nsstoremodelversion identifiers = ( ); NSStoreType = SQLite; NSStoreUUID = "8DC65301-3BC5-42BE-80B8-E44577B8F8E1"; }; reason = " Can ' t find model dla sklepu źródłowego";}
Wygląda na to, że jakoś muszę dołączyć oryginalny model danych, ale nie jestem pewien, jak to zrobić. Jakieś sugestie?
9 answers
Podsumowanie / pełny przewodnik:
-
Przed dokonaniem jakichkolwiek zmian, Utwórz nową wersję modelu.
W Xcode 4: Wybierz swój
.xcdatamodel
- > edytor -> Dodaj wersję modelu.W Xcode 3: Projekt - > Model Danych - > Dodaj Wersję Modelu.
zobaczysz, że nowa
.xcdatamodel
zostanie utworzona w Twoim.xcdatamodeld
folder (który jest również tworzony, jeśli nie masz) . Zapisz.
Wybierz swoją nową
.xcdatamodel
i dokonaj zmiany chcesz zatrudnić zgodnie z } dokumentacją .Zapisz.
-
Ustaw bieżący / aktywny schemat na nowo utworzony schemat.
Z
.xcdatamodeld
wybrany katalog:W Xcode 4: Narzędzia pasek boczny - > Inspektor plików - > Wersjonowany model danych rdzenia - > wybierz nowy schemat.
W Xcode 3: Projekt > Model Danych > Ustaw Bieżącą Wersję.
zielony kleszcz na
.xcdatamodel
ikona przeniesie się do nowego schematu. Zapisz.
-
Zaimplementuj kod niezbędny do przeprowadzenia migracji w czasie wykonywania.
Gdzie tworzony jest
NSPersistentStoreCoordinator
(Zwykle Klasa AppDelegate), dla parametruoptions
zastąpnil
następującym kodem:[NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]
Uruchom aplikację. Jeśli nie ma awarii, prawdopodobnie pomyślnie migrujesz :)
Po pomyślnej migracji kod migracji (Krok 7) można go usunąć. (To od dewelopera zależy, kiedy użytkownicy opublikowanej aplikacji mogą zostać uznani za migrujących.)
Ważne: nie usuwaj starych wersji/schematów modeli. Core Data potrzebuje starej wersji do migracji do nowej wersji.
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-02-22 08:40:52
Rozgryzłem to.
Design > Model Danych > Dodaj Wersję Modelu
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-12-02 01:35:48
Dla Googlerów, to jest to, co musisz zrobić (zakładając, że już skonfigurowałeś Lightweight Migration):
- przed dokonaniem zmian wykonaj projekt - > model danych - > Dodaj wersję modelu (zobaczysz, że w Twoim folderze
.xcdatamodeld
zostanie utworzony nowy.xcdatamodel
) - Zapisz
- Make your change
- Zapisz
- Uruchom Aplikację
Krok # 1 ma kluczowe znaczenie dla tego działania. Napotkałem ten problem, ponieważ wykonałem te kroki, aby dodać nowe pole. Że zadziałało. Dodałem drugie nowe pole, ale zapomniałem "dodać wersję modelu" i wszystko wybuchło.
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
2010-06-27 20:34:51
Również dla googlerów.. Prosta zasada, nigdy nie usuwaj / nie edytuj żadnej starej numerowanej wersji. Po dodaniu wersji modelu przyrostek liczby zwiększy się jako 2..3..4 czyli 2 to najstarszy 3 następny itd.. ale aktualna wersja do edycji to wersja bez numeru.
Nie usuwaj starych wersji modelu, ponieważ użytkownicy z poprzednimi bazami danych używającymi starej wersji modelu nie będą mogli przenieść się do najnowszego modelu bazy danych bez porównywania starych i najnowszych schematów.
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-07-24 14:06:11
Tylko uwaga dla tych, którzy natkną się na to Googlowanie, wydaje się, że nawet przy automatycznej(magicznej) migracji nadal musisz utworzyć wersję oryginalnego sklepu i nową i ustawić nową jako bieżącą wersję.
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-12-08 03:17:21
Póki co widzę tylko jak uniknąć Komunikatu o błędzie.
Ale jak to naprawić - na wypadek, gdybyśmy już coś namieszali??
Następujące rozwiązanie Naprawiono problem, ale stracisz dane W DB:
Usuń / Zmień nazwę pliku SQLITE wdrożonej / zainstalowanej aplikacji.
Nazwa pliku lokalizacja jest podawana bezpośrednio po komunikacie o błędzie. np.:
Reason=Can ' t find model for source store}, {
URL = "file://localhost/Users/yourName/Library/Application%20Support/iPhone%20Simulator/4.3/Applications/62F342D4-F007-4F6F-96D2-68F902D3719A/Documents/Locations.sqlite";
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-08-01 07:53:07
Coś, o czym należy pamiętać podczas lekkiej migracji -
Jeśli planujesz zmienić nazwę / zmodyfikować atrybuty, pamiętaj, aby ustawić wartość" Renaming ID " w Nowym lub starym modelu. Aby użyć własnego przykładu Apple, w XCode 4.3, wybierz paintColor w nowym modelu > Przełącz do Inspektora modelu danych > Ustaw pole " zmiana nazwy ID "na kolor w sekcji" wersjonowanie". Dla mnie niepowodzenie tego kroku doprowadziło do błędu czasu pracy. Ten sam błąd jest również tutaj . Jako nowy użytkownik, nie wolno mi zamieszczać zdjęć, więc tutaj jest link imgur (nie spam, naprawdę).
(Cocoa error 134140.)" UserInfo=0x622b350 {reason=Can't find or automatically infer mapping model for migration
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-05-23 11:46:43
Można również uzyskać ten błąd podczas dokonywania zmian w modelu danych i działa na zainstalowanej aplikacji, która ma inną wersję pliku SQLITE. W takim przypadku po prostu usuń zainstalowaną aplikację i uruchom ją ponownie.
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-21 20:45:05
Na wypadek, gdyby ktoś wpadł w ten scenariusz i żaden z powyższych nie zadziałał... Kasowałem aplikację z symulatora, czyściłem itp, ale nic nie działało. Musiałem przejść do katalogu symulatora i ręcznie rm .plik sqlite, aby aplikacja działała ponownie. Nie mam pojęcia...
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-06-18 23:38:18