Ciągle dostaję "Zapisz błąd operacji" po każdej zmianie w moim modelu danych Xcode

Zacząłem używać Core Data do rozwoju iPhone ' a. Zacząłem od stworzenia bardzo prostego encji (o nazwie Evaluation) z jedną właściwością string (o nazwie evaluationTopic). Miałem następujący kod do wstawienia świeżego ciągu:

- (void)insertNewObject {

    // Create a new instance of the entity managed by the fetched results controller.
    NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
    NSEntityDescription *entity = [[fetchedResultsController fetchRequest] entity];
    NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];

    // If appropriate, configure the new managed object.
    [newManagedObject setValue:@"My Repeating String" forKey:@"evaluationTopic"];

    // Save the context.
    NSError *error;
    if (![context save:&error]) {
        // Handle the error...
    }

    [self.tableView reloadData];
}

To działało idealnie i po naciśnięciu przycisku +Nowy "mój powtarzający się ciąg" zostanie dodany do widoku tabeli i będzie w trwałym sklepie.

Następnie nacisnąłem "Design - > Dodaj wersję modelu" w Xcode. Dodałem trzy byty do istniejącego podmiotu, a także dodano nowe właściwości do istniejącego podmiotu "ewaluacyjnego". Następnie utworzyłem nowe pliki z encji, naciskając "Plik - > Nowy plik - > zarządzane klasy obiektów" i utworzyłem nowy .h i .plik M dla moich czterech podmiotów, w tym podmiotu "oceniającego" z oceną.h i ocena.M. teraz zmieniłem wersję modelu, ustawiając "projekt - > model danych - > Ustaw bieżącą wersję". Po zrobieniu tego wszystkiego, zmieniłem mój insertMethod:

- (void)insertNewObject {

    // Create a new instance of the entity managed by the fetched results controller.
    NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
    NSEntityDescription *entity = [[fetchedResultsController fetchRequest] entity];
    Evaluation *evaluation = (Evaluation *) [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];

    // If appropriate, configure the new managed object.
    [evaluation setValue:@"My even new string" forKey:@"evaluationSpeechTopic"];

    // Save the context.
    NSError *error;
    if (![context save:&error]) {
        // Handle the error...
    }

    [self.tableView reloadData];
}

To nie działa chociaż! Za każdym razem, gdy chcę dodać wiersz, symulator zawiesza się i dostaję następujące:

"NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores.  It cannot perform a save operation.'"

Miałem ten błąd, zanim wiedziałem o tworzeniu nowej wersji po zmianie czegokolwiek w datamodelu, ale dlaczego to wciąż się pojawia? Czy muszę robić mapowanie (mimo że dodałem właśnie encje i właściwości, które wcześniej nie istniały?). W samouczku Apple Dev brzmi to bardzo łatwo, ale zmagam się z tym przez długi czas, nigdy nie działało po zmianie wersji modelu.

Author: Cœur, 2009-07-07

8 answers

Czy masz opcje nsmigratepersistentstoresautomaticallyoption i nsinfermappingmodelautomaticallyoption ustawione podczas tworzenia persistentstorecoordinator w delegacie aplikacji?

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    if (persistentStoreCoordinator != nil) {
        return persistentStoreCoordinator;
    }

    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"database.sqlite"]];

    NSError *error = nil;
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
        // Handle error
    }    

    return persistentStoreCoordinator;
}
 50
Author: hanleyp,
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-07-07 14:16:41

Jeśli tylko dostajesz ten błąd w symulatorze, to zmieniłeś swój model danych i nie usunął pliku SQLITE, którego wcześniej używałeś.

Więc idź do: ~/Library/Application Support/iPhone Simulator/User/Applications/

Następnie przejrzyj foldery o nazwach szesnastkowych, aż zobaczysz swoją aplikację. Otwórz katalog Documents i usuń plik SQLITE. Błąd powinien zniknąć.

 30
Author: Michael Gaylord,
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-29 08:27:04

Jeśli używasz tego na symulatorze / iPhonie, również Odinstaluj aplikację. pracował dla mnie na symulatorze dopiero po tym, jak usunąłem aplikację!

 10
Author: geodude,
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-10-01 06:45:50

Usunięcie i ponowne zainstalowanie aplikacji zarówno w symulatorze, jak i urządzeniu, zadziałało.

 4
Author: elvitucho,
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-05 17:10:04

Jest to spowodowane zmianą bazy danych, ponieważ w aplikacji jest inna baza danych, a w Bibliotece / obsłudze aplikacji/symulatorze iPhone ' a / użytkowniku / aplikacjach jest inna baza danych.... więc Usuń baza danych z folderu aplikacji działa dla mnie.

 3
Author: abhinav,
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-13 06:23:39

Miał ten sam problem i działał, dopóki nie skopiowałem kodu do innego folderu w Finderze i nie zacząłem edytować tego projektu, zaczynając otrzymywanie błędu. Naprawiono to, że mój inny projekt miał storecordinator o nazwie xyz.sqlite," nowy " projekt, nad którym pracowałem miał taką samą nazwę, musiał zmienić go na xyzv2.sqlite (coś w tym stylu). Odpowiedź znaleziona tutaj: http://www.iphonedevsdk.com/forum/iphone-sdk-development/27268-nspersistentstorecoordinator-has-no-persistent-stores.html

 0
Author: Tim Maxey,
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-09-13 18:37:22

Odpowiedź Michaela pasuje do mojej sprawy.
Zmodyfikowałem model danych rdzenia i zaczyna się ten błąd.
Moim rozwiązaniem było usunięcie aplikacji (przytrzymaj Dom i przekrocz aplikację) i ponowne uruchomienie aplikacji. Problem rozwiązany!

 0
Author: Stove,
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-10-20 06:38:48

Możesz również spróbować " Zresetuj zawartość i ustawienia..."w symulatorze. To mi się udało.

 0
Author: njyulan,
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
2015-08-30 23:30:34