Pregunta

Estoy experimentando un problema extraño al intentar contar las entidades en un contexto de objeto administrado.

- (NSUInteger)countEntity:(NSString *)entityName 
                inContext:(NSManagedObjectContext *)context{

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:entityName                     
                                                  inManagedObjectContext:context];
    [request setEntity:entity];
    [request setIncludesSubentities:NO];
    NSError *error = nil;
    NSUInteger count = [context countForFetchRequest:request error:&error];
    [request release];
    return count;
}

La línea:

NSUInteger count = [context countForFetchRequest:request error:&error];

lanza un Razón NSInternalInconsistencyException: 'entidad no encontrada'

Cambiando a:

NSUInteger count = [[context executeFetchRequest:request error:&error] count];

funciona sin ningún problema.

Estoy perdido aquí. ¿Alguna idea?

¡Gracias!

/ Oskar

¿Fue útil?

Solución

Corriendo en esto hoy. Comenzó a suceder cuando introduje una segunda tienda persistente. ¿Tienes más de una tienda en el moc? -Ken

Otros consejos

Por lo que vale la pena, acabo de encontrar un error similar donde executeFetchRequest: error y countForFetchRequest: error: no están de acuerdo en la cantidad de objetos en el solicitud de búsqueda.

El escenario es que he anidado NSManagedObjectContexts con un contexto raíz de tipo NSPrivateQueueConcurrencyType (para guardar en disco) respaldado por un almacén persistente y un hijo con el tipo < código> NSMainQueueConcurrencyType (para uso de la interfaz gráfica de usuario). (Sí, estoy usando MagicalRecord)

Tengo un ViewController escuchando NSManagedObjectContextDideSaveNotification del contexto 'principal'. Cuando esa notificación se activa, el método countForFetchRequest: error: no incluye los cambios realizados en el contexto que no se han guardado en el contexto raíz principal. executeFetchRequest: error sin embargo, devuelve el conjunto esperado de objetos.

Bit wierd.

Comprueba varias cosas:

  1. ¿Cuál es el valor del error después de la primera llamada? La razón por la que pasa ese objeto es para obtener información cuando las cosas salen mal.
  2. ¿Cuál es el valor de [entidad de solicitud] después de la primera llamada? Puede que esté completamente fuera, pero recuerdo vagamente algo acerca de que una solicitud es un contrato de un solo disparo: una vez que lo ejecute, debe restablecer todos los campos antes de poder ejecutarlo nuevamente. Asegúrese de que todas las propiedades de su solicitud sigan siendo válidas después de la primera llamada, o mejor aún, cree una segunda instancia de NSFetchRequest para realizar la segunda llamada.
  3. De manera similar, ¿qué sucede si comenta la primera llamada? ¿Si cambias el orden de las llamadas? El resultado de uno podría estar afectando a otro.

Sospecho que entidad es nil (es decir, context es nil o no tiene un coordinador de tienda persistente configurado correctamente con un modelo de objeto gestionado) que contiene su entidad, o si ha escrito mal el nombre de la entidad en algún lugar del modelo de objeto o en el código de llamada). Verifique que entity no sea nil después de la llamada a + [NSEntityDescription entityForName: inManagedObjectContext:] .

Ejecuté tu método countEntity: en uno de mis propios proyectos y funcionó bien. La única forma en que podía hacer que lanzara una excepción (" _countWithNoChangesForRequest: error: una solicitud de búsqueda debe tener una entidad. & Quot;) fue cuando escribí mal el nombre de la entidad (widgets en lugar de Widgets). Por lo tanto, es posible que desee investigar en esa dirección.

El problema que está experimentando se debe a un uso incorrecto de countForFetchRequest: error :. De hecho, en su fragmento de código, primero ejecute la solicitud de recuperación utilizando executeFetchRequest: error, luego proceda a usar countForFetchRequest: error :.

De la documentación del método:

Devuelve el número de objetos que una solicitud de recuperación dada habría devuelto si se hubiera pasado a executeFetchRequest: error :.

Por lo tanto, NO debe ejecutar la solicitud de recuperación antes de llamar a countForFetchRequest: error :.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top