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?

Author: Eric, 2009-12-02

9 answers

Podsumowanie / pełny przewodnik:

  1. 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) .

  2. Zapisz.

  3. Wybierz swoją nową .xcdatamodel i dokonaj zmiany chcesz zatrudnić zgodnie z } dokumentacją .

  4. Zapisz.

  5. 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.

  6. Zapisz.

  7. Zaimplementuj kod niezbędny do przeprowadzenia migracji w czasie wykonywania.

    Gdzie tworzony jest NSPersistentStoreCoordinator (Zwykle Klasa AppDelegate), dla parametru options zastąp nil następującym kodem:

    [NSDictionary dictionaryWithObjectsAndKeys:
                      [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
                      [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]
    
  8. Uruchom aplikację. Jeśli nie ma awarii, prawdopodobnie pomyślnie migrujesz :)

  9. 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.

 141
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-02-22 08:40:52

Rozgryzłem to.

Design > Model Danych > Dodaj Wersję Modelu

 25
Author: Eric,
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):

  1. przed dokonaniem zmian wykonaj projekt - > model danych - > Dodaj wersję modelu (zobaczysz, że w Twoim folderze .xcdatamodeld zostanie utworzony nowy .xcdatamodel)
  2. Zapisz
  3. Make your change
  4. Zapisz
  5. 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.

 15
Author: davetron5000,
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.

 11
Author: Gmu,
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ę.

 5
Author: rustyshelf,
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";

 1
Author: Thorsten Niehues,
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
 1
Author: Sai Ramachandran,
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.

 0
Author: John Mead,
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...

 -1
Author: shawnwall,
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