2011-03-23 15 views
8

Mi situación es simple: tengo algunos registros en mi almacén de datos central. Uno de sus atributos es una cadena llamada "localId". Hay un punto en el que me gustaría encontrar el registro con un valor particular de ID local. La forma más obvia de hacerlo es con NSFetchRequest y NSPredicate. Sin embargo, cuando configuro esto, la solicitud devuelve cero registros.NSPredicate no devuelve resultados con la solicitud de obtención, funciona con el filtro de matriz

Si, sin embargo, utilizo la solicitud de búsqueda sin el predicado, devolviendo todos los registros y simplemente pulsando sobre ellos buscando el valor de ID local de destino, sí encuentro el registro que estoy buscando. En otras palabras, el registro está allí, pero la solicitud de búsqueda no puede encontrarlo.

Mis otros métodos en los que utilizo solicitudes y predicados de recuperación funcionan todos como se esperaba. No sé por qué esta falla.

quiero hacer esto:

- (void)deleteResultWithLocalID:(NSString *)localId { 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:[NSEntityDescription entityForName:@"WCAAssessmentResult" inManagedObjectContext:context]]; 
    [request setPredicate:[NSPredicate predicateWithFormat:@"localId == %@", localId]]; 
    NSError *error = nil; 
    NSArray *results = [context executeFetchRequest:request error:&error]; 
    NSAssert(error == nil, ([NSString stringWithFormat:@"Error: %@", error])); 
    if ([results count]) [context deleteObject:[results objectAtIndex:0]]; 
    else NSLog(@"could not find record with localID %@", localId); 
    [self saveContext]; 
} 

Pero me acaban de tener que hacer esto:

- (void)deleteResultWithLocalID:(NSString *)localId { 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:[NSEntityDescription entityForName:@"WCAAssessmentResult" inManagedObjectContext:context]]; 
    NSError *error = nil; 
    NSArray *results = [context executeFetchRequest:request error:&error]; 
    NSAssert(error == nil, ([NSString stringWithFormat:@"Error: %@", error])); 
    for (WCAAssessmentResult *result in results) { 
     if ([result.localId isEqualToString:localId]) { 
      NSLog(@"result found, deleted"); 
      [context deleteObject:result]; 
     } 
    } 
    [self saveContext]; 
} 

alguna pista sobre lo que podría ir mal?

edición

He descubierto que puedo utilizar el predicado que estoy creando para obtener los resultados que cabe esperar después de la solicitud de búsqueda ha sido ejecutado. Por lo tanto, el siguiente también funciona:

- (WCAChecklistItem *)checklistItemWithId:(NSNumber *)itemId { 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:[NSEntityDescription entityForName:@"WCAChecklistItem" inManagedObjectContext:context]]; 
    NSArray *foundRecords = [context executeFetchRequest:request error:nil]; 
    foundRecords = [foundRecords filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"serverId == %@", itemId]]; 
    if ([foundRecords count]) { 
     return [foundRecords objectAtIndex:0]; 
    } else { 
     NSLog(@"can't find checklist item with id %@", itemId); 
     return nil; 
    } 
} 

ACTUALIZACIÓN

me he encontrado con otra persona que experimenta este mismo tema:

http://markmail.org/message/7zbcxlaqcgtttqo4

Él no ha encontrado una solución, ya sea .

Blimey! Estoy perplejo.

Gracias!

Respuesta

1

Odio decirlo pero la causa más común de este tipo de problemas es simple typos. Asegúrese de que los nombres de sus atributos y el predicado sean los mismos. Asegúrese de que los nombres de sus propiedades y los nombres de los atributos sean los mismos. Si una referencia a una propiedad funciona pero una referencia al nombre del atributo no existe, probablemente exista una discrepancia.

podría probar para estos últimos mediante la comparación de la devolución de:

[result valueForKey:@"localID"] 

... con el regreso de:

result.localID 
+0

¡Gracias por la pista! Pasaré y me aseguraré de que las cosas estén escritas correctamente. Sin embargo, este problema está sucediendo en varios atributos, por lo que me inclino a pensar que es algo más fundamental. ¡Espero estar equivocado! Wil informa de nuevo. Gracias de nuevo. – CharlieMezak

+0

Ya sabes, este no puede ser el problema, porque como digo en mi pregunta, puedo filtrar los resultados luego usando el mismo predicado que estoy tratando de usar en la solicitud de búsqueda. Entonces, el predicado en sí mismo no puede ser el problema, al menos no en términos de ortografía. ¿Por qué un predicado sería válido para filtrar la matriz de resultados pero no la solicitud de búsqueda? – CharlieMezak

+0

El código anterior no muestra exactamente el mismo predicado. Además, si tiene definidas las subclases NSManagedObject, puede crear un nombre de propiedad que no concuerde con el nombre de la propiedad de la entidad. Una búsqueda buscará el nombre de la propiedad de la entidad, mientras que un predicado en la matriz verá el nombre de la propiedad de la clase. – TechZen

4

Si localId es un valor numérico, entonces debe usar un objeto NSNumber en la formación del predicado en lugar de NSString.

[request setPredicate:[NSPredicate predicateWithFormat:@"localId == %@", 
    [NSNumber numberWithString:localId]]]; 

NSPredicate cadenas de formato citan de forma automática objetos NSString.

+0

Gracias!Ese es un buen punto, pero localId es un valor de cadena. Entonces, no creo que ese sea el problema. Editaré mi pregunta para dejarlo en claro. – CharlieMezak

+1

¡Y ahora parece que el problema es común a todas mis peticiones de búsqueda predicadas, tanto para cadenas como para valores numéricos! ¡AArrg! – CharlieMezak

Cuestiones relacionadas