2010-10-14 26 views
18

me sale el siguiente error al intentar agregar un registro:error de aplicación serio en datos básicos con fetchedResultsContainer

error de aplicación seria. Se detectó la excepción durante el procesamiento de cambio de datos centrales . Esto generalmente es un error dentro de un observador de NSManagedObjectContextObjectsDidChangeNotification. El índice 0 no es válida con userInfo (nulo)

Y eso es todo. Puse puntos de interrupción en todos los métodos de delegado fetchedResultsContainer que he implementado, pero nada se rompe.

que lo rastreó a:

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 he creado 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 el sectionNameKeyPath a cero, funciona, pero es obvio que no lo que yo quiero. También funciona cuando tengo un título ya completado para mi modelo, por lo que titleFirstLetter no devuelve nada, aunque eso no parece ser el problema. Si hago que la cadena sea algo arbitrario si es nula, aún se bloquea.

¿Alguna idea de qué pasa aquí?

ACTUALIZACIÓN: Si utilizo el título en la sección Nombre clave clave en lugar de la propiedad transitoria, no se cuelga, pero obviamente pone cada elemento en su propia sección. Entonces, de alguna manera está relacionado con la propiedad transitoria ...

ACTUALIZACIÓN2: Algunos intentos de piratería informática con el uso de una propiedad persistente en lugar de transitoria, y ningún otro cambio, parece funcionar bien, por lo que parece ser un error. Tengo un informe de error abierto: # 8553064

ACTUALIZACIÓN3: Bien, rayar eso. Usar un atributo persistente no hizo ninguna diferencia. Estoy un poco en el final ahora.

Gracias!

Respuesta

12

Bueno, este es probablemente un error del usuario parcial o totalmente. El problema era que, en la vista en la que agrego un nuevo artículo, había puesto [self.tableView reloadData] dentro del método viewWillAppear. Al comentar eso, no se actualizaron las celdas de la tabla, pero se evitó el bloqueo.

Luego, seguí adelante y envié reloadRowsAtIndexPaths:withRowAnimation: a la vista de tabla para volver a cargar manualmente las pocas celdas que lo necesitaban.

¡Me alegra que finalmente haya terminado!

+0

¡Salvó mi tocino! ¡Gracias! ¿Dónde agregaste reloadRowsAtIndexPaths: withRowAnimation :? –

+0

muy gracias. este problema me molesta por mucho tiempo. – derjohng

2

El comportamiento predeterminado del controlador de resultados obtenidos es crear una sección para cada primera letra del sectionNameKeyPath. No debería recibir una sección por artículo a menos que cada elemento comience con una letra diferente.

Si desea personalizar el comportamiento del nombre de sección, subclase NSFetchedResultsController y anular y sectionIndexTitles. Consulte los documentos NSFetchedResultsController para obtener más detalles.

+0

Entonces, ¿qué estoy haciendo mal aquí? http://assets.zerodeviation.net/sections.png Esto es con el título como sectionNameKeyPath. – Christoph

+0

Para agregar a esto, los documentos dicen que __IndexTitle__ es por defecto la primera letra del capital. Y eso es verdad Pero estoy hablando de los títulos de las secciones. – Christoph

+0

Los indexTitles son los títulos de las secciones. Mira cómo la lista de aplicaciones de contacto nombra. Utiliza este método exacto incorporado. No sé por qué estás teniendo este problema. Lo más probable es que haya algo que haya cruzado los atributos. – TechZen

1

Descubrí otra forma de llegar a esta misma excepción críptica. Mi propiedad transitoria, como la tuya, para extraer la primera letra, no estaba protegida contra una cadena de 0 de longitud (@ ""). El intento de obtener su primer personaje arrojó una excepción y dio como resultado este error de Datos centrales (y no la excepción que esperaría ver).

2

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 delegados NSFetchedResultsController. Siempre copio y pego los 4 métodos de Apple para implementar NSFetchedResultsController.

Por desgracia me había perdido uno de estos:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller { 
    [self.tableView beginUpdates]; 
} 

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { 
    [self.tableView endUpdates]; 
} 

asegúrese de contar con los tiene, de lo contrario te tire de los pelos como yo.

+0

¡Voy a estar pendiente de ellos, gracias! – Christoph

+0

Esta es una solución muy simple para un problema común. Mientras que todas las otras respuestas estoy seguro también son correctas, este error sutil también puede generar el mismo error. Digno de notar. –

0

Importante

NSFetchedResultsController * consultMessageFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[[[WYCoreDataStorage shareStore] coreDataHelper] mainContext] sectionNameKeyPath:nil cacheName:nil]; 

Si está utilizando una memoria caché, debe llamar deleteCacheWithName: antes de cambiar cualquiera de la solicitud de búsqueda, su predicado, o sus descriptores de clasificación. No debe reutilizar el mismo controlador de resultados obtenidos para múltiples consultas, a menos que configure cacheName en nil.

Cuestiones relacionadas