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!
¡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
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
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