Error de CoreData en el context de salvar, NSPersistentStoreCoordinator no tiene almacenes persistentes.

He examinado todas las preguntas similares que puedo encontrar y ninguna de sus soluciones está funcionando para mí.

Un problema podría ser que la adición de entidades al context (que tiene éxito) y el ahorro del context suceden en un hilo diferente después de que recupere JSON y se analice desde un webAPI. Pero el context se configura la primera vez que se usa el gestor de text y el almacén persistente, como se puede ver a continuación. Entonces sería en ese hilo después del análisis donde esto está sucediendo.

El error exacto:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation.' 

Intenté eliminar la aplicación del simulador, como se sugirió, no cambió.

Aquí está mi class CoreDataHelper que estoy usando, y solo hay 1 instancia en mi aplicación, el error ocurre cuando llamo al método saveContext en el ayudante después de agregar elementos nuevos al context:

 @implementation CoreDataHelper @synthesize managedObjectContext = _managedObjectContext; @synthesize managedObjectModel = _managedObjectModel; @synthesize persistentStoreCoordinator = _persistentStoreCoordinator; #pragma mark - Application's Documents directory // Returns the URL to the application's Documents directory. - (NSURL *)applicationDocumentsDirectory { return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; } - (void)saveContext { NSError *error = nil; if (self.managedObjectContext != nil) { if ([self.managedObjectContext hasChanges] && ![self.managedObjectContext save:&error]) { // Replace this implementation with code to handle the error appropriately. // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } } } - (void)dealloc { [self saveContext]; } #pragma mark - Core Data stack // Returns the managed object context for the application. // If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application. - (NSManagedObjectContext *)managedObjectContext { if (_managedObjectContext != nil) { return _managedObjectContext; } NSPersistentStoreCoordinator *coordinator = self.persistentStoreCoordinator; if (coordinator != nil) { _managedObjectContext = [[NSManagedObjectContext alloc] init]; [_managedObjectContext setPersistentStoreCoordinator:coordinator]; } return _managedObjectContext; } // Returns the managed object model for the application. // If the model doesn't already exist, it is created from the application's model. - (NSManagedObjectModel *)managedObjectModel { if (_managedObjectModel != nil) { return _managedObjectModel; } NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"]; _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; return _managedObjectModel; } // Returns the persistent store coordinator for the application. // If the coordinator doesn't already exist, it is created and the application's store added to it. - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if (_persistentStoreCoordinator != nil) { return _persistentStoreCoordinator; } NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"UserGroupTV.sqlite"]; NSError *error = nil; _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; // needed for lightweight migrations NSMutableDictionary *options = [NSMutableDictionary dictionary]; [options setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption]; [options setObject:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption]; if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error" message:[error localizedDescription] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; [alertView show]; } return _persistentStoreCoordinator; } @end 

ETA: Lo he visto mencionado, pero ¿cómo / dónde borro la carpeta local en la máquina que almacena el file sql?

No tengo una respuesta clara, pero hay algunas cosas a tener en count:

  1. Ponga algo de logging en donde cree el persistentStoreCoordinator . Si se produce un error al agregar la tienda durante la creación, puede capturarlo allí.

  2. Mencionó que está guardando el context del object gestionado en un hilo de background. NSManagedObjectContext no es seguro para subprocesss y solo debe usar un context específico en el subprocess en el que se creó. Debe tener, como mínimo, un context por subprocess. Puede observar 'NSManagedObjectContextDidSaveNotification' y combinar los cambios en su context principal.

Resulta que estaba borrando la tienda y no recreandola cada vez que recordaba la API web. Mi objective original era limpiar la database cada vez que un usuario quería actualizar la list de videos llamando a la API, y estaba borrando todos los objects, y luego eliminé la tienda y olvidé volverla a crear. Aquí estaba mi esquema de database de actualización, simplemente eliminé todo debajo de la llamada saveContext.

 - (void)resetDataBase { [self deleteAllObjects:@"Speaker"]; [self deleteAllObjects:@"Tag"]; [self deleteAllObjects:@"UserGroup"]; [self deleteAllObjects:@"Video"]; [_coreDataHelper saveContext]; // REMOVED BELOW and it worked NSPersistentStore * store = [[_coreDataHelper.persistentStoreCoordinator persistentStores] lastObject]; if (store) { NSError * error; [_coreDataHelper.persistentStoreCoordinator removePersistentStore:store error:&error]; if (error) { [self showError:error]; } } NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"UserGroupTV.sqlite"]; [[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil]; }