iphone - redes - Error grave de la aplicación en los datos del núcleo con fetchedResultsContainer
mi iphone no se conecta a wifi contraseña incorrecta (5)
Recibo el siguiente error al intentar agregar un registro:
Grave error de aplicación. Se detectó una excepción durante el proceso de cambio de Core Data. Esto suele ser un error dentro de un observador de NSManagedObjectContextObjectsDidChangeNotification. El índice 0 no es válido con userInfo (nulo)
Y eso es. Puse puntos de interrupción en todos los métodos de delegado que he implementado, pero no se rompe nada.
Lo localicé hasta
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"titleFirstLetter" cacheName:@"Root"];
"sectionNameKeyPath" es el problema. "titleFirstLetter" es una propiedad transitoria para la que creé un getter en mi subclase NSManagedObject.
Aquí está el captador:
-(NSString *)titleFirstLetter
{
[self willAccessValueForKey:@"titleFirstLetter"];
NSString *aString = [[self valueForKey:@"title"] uppercaseString];
NSString *stringToReturn = [aString substringWithRange:[aString rangeOfComposedCharacterSequenceAtIndex:0]];
[self didAccessValueForKey:@"titleFirstLetter"];
return stringToReturn;
}
Cuando cambio la sectionNameKeyPath a nil, funciona, pero obviamente no es lo que quiero. También funciona cuando ya tengo un título para mi modelo, por lo que titleFirstLetter no devuelve ningún valor, aunque no parece ser el problema. Si hago que la cadena sea arbitraria, si es nula, todavía se bloquea.
¿Alguna idea de que hay aquí?
ACTUALIZACIÓN: Si utilizo el título en la sección NameKeyPath en lugar de la propiedad transitoria, no se bloquea, pero obviamente coloca cada elemento en su propia sección. Así que de alguna manera está relacionado con la propiedad transitoria ...
ACTUALIZACIÓN2: Algunos trucos preliminares con el uso de una propiedad persistente en lugar de transitoria, y ningún otro cambio, parecen funcionar bien, por lo que parece ser un error. Tengo un informe de error abierto: # 8553064
ACTUALIZACIÓN 3: Bueno, rasca eso. El uso de un atributo persistente no hizo ninguna diferencia. Estoy un poco agotado ahora.
¡Gracias!
Bueno, esto es probablemente en parte (o totalmente) error del usuario. El problema era que, en la vista en la que agrego un nuevo elemento, había puesto [self.tableView reloadData]
dentro del método viewWillAppear
. Comentando eso no actualizó las celdas de la tabla, pero evitó el bloqueo.
Luego seguí adelante y envié reloadRowsAtIndexPaths:withRowAnimation:
a la vista de tabla para recargar manualmente las pocas celdas que lo necesitaban.
Me alegro de que finalmente haya terminado!
Descubrí otra forma de llegar a esta misma excepción críptica. Mi propiedad transitoria, como la suya, para extraer la primera letra, no estaba protegida contra una cadena de longitud 0 (@ ""). El intento de obtener su primer carácter arrojó una excepción y dio como resultado este error de Core Data (y no la excepción que esperaría ver).
El comportamiento predeterminado del controlador de resultados obtenido es crear una sección para cada primera letra de la sectionNameKeyPath
. No debe obtener una sección por artículo a menos que cada artículo comience con una letra diferente.
Si desea personalizar el comportamiento del nombre de la sección, subclase NSFetchedResultsController
e sectionIndexTitleForSectionName:
y sectionIndexTitles
. Consulte la documentación de NSFetchedResultsController
para obtener más información.
Importante
NSFetchedResultsController * consultMessageFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[[[WYCoreDataStorage shareStore] coreDataHelper] mainContext] sectionNameKeyPath:nil cacheName:nil];
Si está utilizando un caché, debe llamar a deleteCacheWithName: antes de cambiar cualquiera de la solicitud de recuperación, su predicado o sus descriptores de clasificación. No debe reutilizar el mismo controlador de resultados obtenido para múltiples consultas a menos que establezca el nombre de caché en nulo.
Pensé que este era mi problema. Recibí el mismo mensaje de advertencia, pero mi solución fue MUY diferente.
Puede obtener este error si no ha implementado correctamente todos los métodos del Delegado NSFetchedResultsController. Siempre copio y pego los 4 métodos de Apple para implementar NSFetchedResultsController.
Lamentablemente me había perdido uno de estos:
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
[self.tableView beginUpdates];
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
[self.tableView endUpdates];
}
ASEGÚRATE DE QUE TENAS EM, de lo contrario, te arrancarás el pelo como a mí.