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.
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;
}
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ąć.
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ę!
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.
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.
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
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!
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.
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